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{} // 复合字面量,显式构造零值结构体
}这两行代码效果完全一致:
二者生成的都是有效的、可寻址的结构体实例,因此 (*A).demo 方法可正常调用(接收者 this 指向有效内存地址),输出 &main.A{Name:""} 也印证了这一点。
⚠️ 注意事项:
✅ 总结:
var s S 和 s := S{} 都产生结构体的零值实例,二者在语义、内存布局和行为上完全等价。理解这一点有助于避免误判“未初始化结构体是否可用”——只要不是指针,它就是安全、合法、可直接使用的值。