1 Go nil 空结构体 空接口有什么区别?
1.1 nil是一个零值变量
从定义可以看出nil是一个预定义的变量,并且是以下类型的变量:
指针、管道、函数、接口、Map、切片
python
代码解读
复制代码
// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type
1.2 空结构体
1.2.1 大小为0
1.2.2 都指向同一个地址zerobase(不被包含在其他结构体中时)
runtime\malloc.go
go
代码解读
复制代码
// base address for all 0-byte allocations
var zerobase uintptr
1.2.3 作为结构体字段的偏移
- 只有一个空接口体字段时
结构体本身和其字段都指向zerobase
- 当有其他字段时,并且空结构体字段处于第一个字段时
空结构体字段和整个变量的地址及第二个字段的地址一样
- 当有其他字段时,并且空结构体字段处于中间字段时
空结构体字段的地址会紧跟前一个字节的末尾
- 当有其他字段时,并且空结构体字段处于最后字段时
空结构体字段的地址会紧跟前一个字节的末尾,但会进行填充,并且填充长度与前一个字段相同。
1.3 空接口
空接口的底层实现是eface,_type字段存储具体对象的类型,data字段存储具体对象的值
rust
代码解读
复制代码
type eface struct {
_type *_type //
data unsafe.Pointer //
}
细节:只有当eface的两个字段都为nil时,eface才为nil