必须用 var 声明:包级变量、函数内仅声明不初始化、需显式指定类型;:= 仅限函数内且需至少一个新变量名,否则报错。

Go 语言变量定义不是“选一种写法就行”,而是要根据使用场景、作用域和是否需要初始化来决定用 var、:= 还是短变量声明,三者不能混用在同一个作用域内。
什么时候必须用 var 声明?
在包级(全局)作用域中,只能用 var;函数内部若只声明不初始化,也必须用 var;另外,需要显式指定类型(比如避免类型推导出错)时也得用它。
-
var count int—— 声明但不赋值,初值为0 -
var name string = "Alice"—— 显式类型 + 初始化 -
var a, b int = 1, 2—— 多变量同类型批量声明 - 包级变量如
var Version = "1.2.0"不能用:=
:= 短变量声明的限制条件
:= 是函数内部专用语法,且要求左边至少有一个新变量名,否则编译报错 no new variables on left side of :=。
- ✅ 正确:
name := "Bob"、x, y := 10, "hello" - ❌ 错误:
name := "Alice"; name := "Bob"(重复声明) - ❌ 错误:
count := 5; count := 10(没有新变量) - ⚠️ 注意:循环体内的
for i := 0; i 中的i是每次迭代的新变量,但作用域仅限该次迭代
变量类型推导与常见踩坑点
Go 的类型推导很严格,:= 和 var 初始化时都依赖右值类型,但容易因字面量歧义导致意外类型(比如整数字面量默认是 int,而 time.Duration 是 int64)。
立即学习“go语言免费学习笔记(深入)”;
-
timeout := 30→ 类型是int,不能直接传给需要time.Second的函数 - 应写成
timeout := 30 * time.Second或var timeout time.Duration = 30 - 数组长度用字面量时不能用变量:
var buf [1024]byte✅,size := 1024; var buf [size]byte❌(编译失败) - 切片、map、channel 必须用
make或字面量初始化,仅var s []int得到的是 nil 切片
最容易被忽略的是作用域和重声明规则——:= 看似方便,但在 if/for 代码块里嵌套使用时,可能意外创建新变量而非赋值,调试时变量行为和预期不符。宁可多打几个字母用 var 或显式赋值,也别依赖 := 的“自动识别”。










