go中var声明语法为var变量名类型,支持显式类型或初始值推导,批量声明需类型统一,变量必初始化为零值,与:=相比适用于包级声明及需明确类型的场景。

var 声明变量时类型写在变量名后面,和 C/Java 相反
Go 的 var 语法是 var 变量名 类型,不是 var 类型 变量名。初学者常按其他语言习惯写反,导致编译报错 expected type, found identifier。
- 正确写法:
var age int、var name string - 错误写法:
var int age(语法错误) - 类型可以省略,让 Go 自动推导,但必须带初始值:
var score = 95.5→ 推导为float64
var 声明支持批量写法,但不能混用显式类型和隐式推导
多个变量一起声明时,用括号包裹,提升可读性;但所有变量必须统一使用显式类型,或全部靠初始值推导——不能一半写 int、一半写 = 42。
- 合法批量声明(显式类型):
var ( x int y string z bool ) - 合法批量声明(全推导):
var ( a = 100 b = "hello" c = true ) - 非法混合:
var (n int; m = 42)→ 编译失败
函数内部用 var 声明的变量不会自动初始化为零值?不,它会
这是个常见误解。无论包级还是函数内,var 声明的变量**一定**被赋予对应类型的零值:int 是 0,string 是 "",*int 是 nil。不需要也不允许写 var x int = 0 这种冗余赋值。
- 包级变量:
var count int→count初始就是0 - 局部变量:
func f() { var s string; fmt.Println(s) }→ 输出空字符串,不是 panic - 结构体字段也适用:
var u User→ 所有字段均为各自零值
var 和 := 的核心区别:作用域与重复声明限制
:= 是短变量声明,只能在函数内部使用,且要求左侧至少有一个新变量名;var 没有这些限制,能用于包级声明、明确类型意图、或需要多次声明同名变量(比如不同作用域嵌套)的场景。
-
var可以在函数外用:var globalConfig = Config{Port: 8080} -
:=在 if 分支里重声明同名变量合法:if x := getValue(); x > 0 { ... },但外面的x不受影响 - 同一作用域下,
var x int后不能再var x string;而x := 1后再x := "a"会报错no new variables on left side of :=
var 不可替代;日常局部变量多数用 := 更简洁。别为了“统一风格”强行把 := 全换成 var,也别在需要类型提示时回避 var。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











