切换语言为:繁体
Go nil 空结构体 空接口有什么区别?

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

  • 爱糖宝
  • 2024-10-30
  • 2032
  • 0
  • 0

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

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

1.2.2 都指向同一个地址zerobase(不被包含在其他结构体中时)

runtime\malloc.go

// base address for all 0-byte allocations
var zerobase uintptr

1.2.3 作为结构体字段的偏移

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

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

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

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

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

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

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

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

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

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

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

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

1.3 空接口

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

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

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

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

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.