结构体指针零值为nil,解引用会panic;安全初始化用&Struct{}或new(Struct),前者支持字段初始化;带指针接收者的方法可被nil调用,但访问字段会panic;切片/map中结构体指针需显式初始化。
结构体指针的零值就是 nil
Go 中任何指针类型的零值都是 nil,结构体指针也不例外。声明但未初始化的结构体指针变量,其值就是 nil,不指向任何内存地址。直接对它解引用(如 p.Name = "x")会 panic:invalid memory address or nil pointer dereference。
常见错误场景:
- 函数返回结构体指针但内部未用
&Struct{}或new()初始化,调用方直接使用 - map 或 slice 中存储结构体指针,但忘记为每个元素分配内存
- 嵌套结构体中某个字段是指针类型,父结构体用字面量初始化时该字段留空(即未显式赋值),结果为
nil
两种安全初始化方式:& 和 new()
&T{} 和 new(T) 都能获得一个非 nil 的结构体指针,但行为不同:
-
&MyStruct{}返回指向新分配零值结构体的指针,支持字段初始化,例如&MyStruct{Name: "a"} -
new(MyStruct)同样分配内存并清零,但**不支持字段初始化**,只能得到全零值的指针 - 性能上无实质差异,
&T{}更常用、更直观
示例: