:=用于函数内短变量声明,自动推导类型并强制初始化;不可用于包级,包级须用var并可省略类型(若有初始值)。

用 := 声明并初始化局部变量最常用
Go 中不能只声明不初始化(除非用 var 显式写类型),所以带初始值的变量声明,基本就是“声明 + 赋值”一步到位。函数内最自然的方式是短变量声明:name := "hello"。它自动推导类型,简洁且强制初始化。
常见错误是试图在包级(全局)作用域用 := —— 这会报错 syntax error: non-declaration statement outside function body。短声明只能用于函数内部。
-
age := 25→ 推出int -
active := true→ 推出bool -
price := 19.99→ 推出float64(不是float32)
包级变量必须用 var 声明并初始化
全局变量(在函数外)不能用 :=,必须显式用 var。这时可以省略类型,只要右边有初始值,Go 就能推导:
var version = "v1.2.0" var timeout = 30 * time.Second
但如果初始值是 nil 或字面量不够明确(比如 0),类型推导会失败,必须写全:
立即学习“go语言免费学习笔记(深入)”;
-
var data []byte = nil✅(nil无类型,需指定) -
var fn func() = nil✅ -
var count = 0❌ 可能被推成int,但某些场景需要int32,应写var count int32 = 0
用 var 批量声明多个带初值的变量
当多个变量类型不同但想对齐书写时,可以用括号批量声明。每行可带或不带类型,只要右边有值就能推导:
var (
name = "Alice"
age = 30
score = 95.5
)
注意:这种写法里不能混入未初始化的变量(如 active bool 单独一行),否则编译报错 declaration has no effect。所有项都必须有初始值,或者显式写出类型+初始化。
- 支持跨行、易读,适合配置项集中定义
- 若某变量需特定类型(如
uint8),必须写成code uint8 = 255,不能只写code = 255(会推成int)
不要用 new() 或 make() 来“声明带初值的变量”
new(T) 返回 *T,值为零值;make([]T, n) 返回初始化的切片/映射/通道。它们不是变量声明语法,而是内存分配操作。误用会导致多一层指针或冗余初始化:
-
str := new(string)→ 得到*string,值为"",但你要的是string类型变量,直接写str := ""更清晰 -
list := make([]int, 3)→ 初始化长度为 3 的切片,元素全为0;如果只是想声明一个空切片,list := []int{}或var list []int更符合语义
真正需要 make 的场景,是创建非零长度的 slice/map/channel;日常变量初始化,优先走 := 或 var =。
类型推导看似简单,但一旦涉及数字字面量、接口、nil 或复合字面量,就容易推错类型。写的时候多看一眼 go vet 提示,比事后调试快得多。


















