
go 中结构体没有 `nil` 值;其零值是一个所有字段均被初始化为对应类型零值的实例,`var s s` 和 `s := s{}` 在语义和运行时行为上完全等价。
在 Go 语言中,结构体(struct)本身是一种值类型,不能为 nil。所谓“零值”,是指当变量声明但未显式初始化时,Go 自动为其分配的默认初始状态。根据 Go 语言规范,该过程是递归且确定的:每个字段都会被设为其类型的零值——例如 string 为 ""、int 为 0、bool 为 false,而指针、切片、映射等引用类型字段则为 nil。
回到你的示例代码:
type A struct {
Name string // string 的零值是 ""
}
func main() {
var ele A // 声明并零值初始化
ele2 := A{} // 复合字面量,显式构造零值结构体
}这两行代码效果完全一致:
- var ele A:声明变量 ele,Go 自动将其字段 Name 初始化为 "";
- ele2 := A{}:使用空复合字面量创建一个 A 类型新值,同样将 Name 设为 ""。
二者生成的都是有效的、可寻址的结构体实例,因此 (*A).demo 方法可正常调用(接收者 this 指向有效内存地址),输出 &main.A{Name:""} 也印证了这一点。
⚠️ 注意事项:
- ❌ 你无法对结构体变量赋 nil:var s A = nil 是编译错误;
- ✅ 但可以对指向结构体的指针赋 nil:var p *A = nil,此时 p 是 nil,解引用会 panic;
- ✅ 字段若为引用类型(如 []int, map[string]int, *string),其零值确实是 nil,但结构体整体仍非 nil。
✅ 总结:
var s S 和 s := S{} 都产生结构体的零值实例,二者在语义、内存布局和行为上完全等价。理解这一点有助于避免误判“未初始化结构体是否可用”——只要不是指针,它就是安全、合法、可直接使用的值。








