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

简介: 本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。

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

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

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

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

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

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

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

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

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

1.3 空接口

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

rust

代码解读

复制代码

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

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


转载来源:https://juejin.cn/post/7431201720108515365

相关文章
|
25天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
25天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
99 71
|
1月前
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
43 3
|
3月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
37 7
|
3月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
43 5
|
3月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
3月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
4月前
|
Unix 编译器 Go
|
4月前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
53 0
|
4月前
|
存储 安全 程序员