:= 只能在函数内使用且必须声明至少一个新变量,否则报“no new variables”错误;包级变量只能用var;支持多类型批量声明;词法作用域内允许同名重声明。

短变量声明 := 只能在函数内部用,且必须至少声明一个新变量——这是编译器强制的规则,不是风格建议。
为什么 := 会报 “no new variables on left side of :=”?
这不是语法错误,而是 Go 编译器在帮你拦截低级拼写 bug。当你写:
name := "Alice" name := "Bob" // ❌ 编译失败:no new variables on left side of :=
Go 明确拒绝这种写法,因为左侧所有变量(name)都已存在。它要求 := 必须“带来新东西”。
- ✅ 正确:
name, age := "Alice", 30(age是新变量) - ✅ 正确:
name, _ := getNameAndID()(_是新变量,且被忽略) - ❌ 错误:
name := "Bob"(name已声明,不能用:=覆盖) - ✅ 替代:改用
=赋值:name = "Bob"
:= 不能用于包级变量声明
你无法在函数外、func 之外的地方用 :=,哪怕只是想偷懒省个 var:
立即学习“go语言免费学习笔记(深入)”;
package main // ❌ 编译错误:syntax error: non-declaration statement outside function body // message := "hello" // ✅ 唯一合法方式:用 var var message = "hello" var count int = 42
-
:=是局部作用域专属语法糖,设计初衷就是为函数内快速初始化服务 - 包级变量必须显式使用
var,哪怕类型可推导(如var name = "go") - 批量包级变量推荐用
var ( ... )块,提升可读性
多变量声明时类型不一致也没问题
:= 支持混合类型一次性声明,编译器各自推导,无需对齐:
name, age, active := "Tom", 28, true // string, int, bool x, y, z := 10, 3.14, "pi" // int, float64, string
- 右侧表达式类型决定左侧变量类型,互不影响
- 但要注意:如果某变量已在当前作用域声明过,又出现在多变量
:=左侧,它不会被“重声明”,只会被赋新值——前提是至少还有一个新变量 - 例如:
age := 25后,再写age, height := 26, 175是合法的(height是新变量)
最容易被忽略的一点::= 的“新变量”判定是**词法作用域内**的,不是整个函数。比如 if 或 for 块里声明的变量,在块外就不可见,所以同一函数中不同代码块里用相同名字 := 是完全允许的——它们根本不是同一个变量。










