nil,空接口,空结构体有什么区别

我的总结
nil是空,并不一定是空指针
nil是六种类型的零值
每种类型的nil是不同的,不能比较
空结构体
是go中特殊的类型
空结构体的值不是nill
指针也不是nill,但是都是相同(zerobase)
空接口
空接口的值也不一定是nil
类型为nil,值为nil才是nil接口
AI根据我的总结使用代码解释并完善
1 | package main |
完整解释:
1. nil的本质
• 是6种类型的零值:指针、接口、切片、map、channel、函数
• 不同类型的nil不相等,内存表示不同
1 | var p *int |
2. 空结构体 struct{}
• 实例不占内存(size=0)
• 所有实例共享同一内存地址(zerobase)
• 常用于信号传递(channel信号)、实现Set
1 | // 作为方法接收器 |
3. 空接口 interface{}
• 由类型指针和数据指针组成(runtime.eface)
• 双重nil才等于nil
1 | // 接口内部结构示意 |
关键区别表格
特性 | nil | struct{} | interface{} |
---|---|---|---|
内存占用 | 类型决定 | 0字节 | 16字节(2指针) |
相等性 | 同类型相等 | 地址始终相同 | 类型+值双nil才相等 |
典型用途 | 表示缺失值 | 占位符/信号 | 泛型容器 |
指针比较 | 0x0 | zerobase地址 | 依赖存储内容 |