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

114 阅读1分钟

1 Go nil 空结构体 空接口有什么区别?

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 作为结构体字段的偏移

  1. 只有一个空接口体字段时

结构体本身和其字段都指向zerobase

  1. 当有其他字段时,并且空结构体字段处于第一个字段时

空结构体字段和整个变量的地址及第二个字段的地址一样

  1. 当有其他字段时,并且空结构体字段处于中间字段时

空结构体字段的地址会紧跟前一个字节的末尾

  1. 当有其他字段时,并且空结构体字段处于最后字段时

空结构体字段的地址会紧跟前一个字节的末尾,但会进行填充,并且填充长度与前一个字段相同。

1.3 空接口

空接口的底层实现是eface,_type字段存储具体对象的类型,data字段存储具体对象的值

type eface struct {
    _type *_type    // 
    data  unsafe.Pointer // 
}

细节:只有当eface的两个字段都为nil时,eface才为nil