Go语言中所有变量声明后自动获得零值,内置类型和用户定义类型均有明确定义的零值;指针、slice、map等为nil,数值类型为0,字符串为空,结构体为各字段零值组合;nil仅适用于部分引用类型,不可用于int、string等;零值机制递归作用于嵌套结构体字段。

Go语言中所有变量声明后自动获得零值,无需显式初始化;这是语言强制保证的行为,不是约定也不是优化。
哪些类型有确定的零值
所有内置类型和用户定义类型(包括结构体、数组、切片、map、channel、指针、函数、接口等)都有明确定义的零值:
-
int、float64、bool的零值分别是0、0.0、false -
string的零值是空字符串"" - 指针、函数、接口、slice、map、channel 的零值都是
nil - 结构体的零值是其每个字段零值的组合;例如
type T struct{ a int; b string }的零值等价于T{a: 0, b: ""}
零值在不同声明方式下的表现一致
无论用哪种语法声明变量,只要没显式赋值,就一定是零值:
-
var x int→x == 0 -
y := 0是短变量声明,但右边是字面量,不触发零值机制 -
z := struct{}{}中的{}是字面量初始化,不是零值;而var z struct{}才是零值 - 结构体字段未在字面量中列出时,自动取零值:
type P struct{ a, b int }; p := P{a: 1}→p.b == 0
零值与 nil 的区别容易混淆
nil 是某些类型的零值,但它本身不是类型,也不能用于所有类型:
立即学习“go语言免费学习笔记(深入)”;
-
nil可以赋给指针、slice、map、channel、func、interface 类型的变量 -
nil不能赋给int、string、struct等类型(编译报错:cannot use nil as int value) - 判断 map 或 slice 是否为空,应优先用
len(m) == 0而非m == nil,因为非-nil map/slice 也可能长度为 0 - 对
nilslice 进行append是安全的;但对nilmap 写入会 panic:assignment to entry in nil map
结构体嵌套时零值逐层生效
零值机制递归作用于所有字段,包括匿名字段和内嵌结构体:
type User struct {
Name string
Profile struct {
Age int
Tags []string
}
}
var u User
// u.Name == ""
// u.Profile.Age == 0
// u.Profile.Tags == nil(不是空切片,是 nil 切片)
注意:内嵌结构体字段若未显式初始化,其本身也是零值,其中的引用类型字段(如 []string)仍为 nil,不是 []string{}。这点在 JSON 解码或 HTTP 请求解析时容易引发空指针判断误判。










