go 中结构体的零值不是 nil,而是其每个字段都被递归初始化为各自类型的默认零值(如字符串为 ""、整数为 0、布尔为 false),且 `var s struct` 与 `s := struct{}` 在语义和运行时行为上完全等价。
在 Go 语言中,结构体本身是一种值类型(value type),因此它没有 nil 状态——只有指针、切片、map、channel、func 和 interface 等引用类型才可能为 nil。当你声明一个结构体变量而未显式初始化时,Go 会自动为其所有字段赋予该类型的零值(zero value),这一过程是递归且确定的。
例如,对于如下结构体:
type Person struct {
Name string
Age int
Active bool
}以下三种声明方式完全等价,均产生相同的零值实例:
var p1 Person // 零值:{Name: "", Age: 0, Active: false}
p2 := Person{} // 等价的复合字面量写法
p3 := Person{Name: "", Age: 0, Active: false} // 显式写出零值(不推荐,冗余)运行时验证如下:
fmt.Printf("%+v\n", p1) // {Name:"" Age:0 Active:false}
fmt.Printf("%+v\n", p2) // {Name:"" Age:0 Active:false}
fmt.Println(p1 == p2) // true —— 值类型可直接比较⚠️ 注意事项:

总结:Go 的零值机制保障了内存安全与确定性——所有变量在使用前必有明确定义的初始状态。理解结构体零值的本质,是写出健壮、可预测 Go 代码的基础。