1.1 nil是一个零值变量
从定义可以看出nil是一个预定义的变量,并且是以下类型的变量:
指针、管道、函数、接口、Map、切片
// 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
// base address for all 0-byte allocations var zerobase uintptr
1.2.3 作为结构体字段的偏移
只有一个空接口体字段时
结构体本身和其字段都指向zerobase
当有其他字段时,并且空结构体字段处于第一个字段时
空结构体字段和整个变量的地址及第二个字段的地址一样
当有其他字段时,并且空结构体字段处于中间字段时
空结构体字段的地址会紧跟前一个字节的末尾
当有其他字段时,并且空结构体字段处于最后字段时
空结构体字段的地址会紧跟前一个字节的末尾,但会进行填充,并且填充长度与前一个字段相同。
1.3 空接口
空接口的底层实现是eface,_type字段存储具体对象的类型,data字段存储具体对象的值
type eface struct { _type *_type // data unsafe.Pointer // }
细节:只有当eface的两个字段都为nil时,eface才为nil