Go学习–谈谈空结构体strcut{}{}
1、特性
- 空结构体是一种特殊的结构体,不包含任何元素。
type empty struct{}
-
占用内存为0,节省内存。
-
所有空结构体的指针相同。
源码中可以看出,创建新的对象时,需要调用
malloc.newobject()
进行内存分配,进一步调用mallocgc
方法,在该方法中,如果判断类型的size==0
,固定返回zerobase
的地址。zerobase
是一个uintptr
全局变量,占用 8 个字节。因此我们可以确定的是,在Go语言中,所有针对
size==0
的内存分配,用的都是同一个地址&zerobase
,所以我们在一开始看到的所有空结构体地址都相同。
2、使用场景
(1)Set集合
Set 是保存不重复元素的集合,但是 Go 语言没有提供原生的 Set 类型。但是我们知道 Map 结构存储的是 key-value 类型,key 不允许重复,因此可以利用 Map 来实现 Set,key存储需要的数据,value 给个固定值就可以了。那么 value 给什么值好呢?这时候我们的 空结构体
就可以出场了,不占用空间,还可以完成占位操作,堪称完美。
(2)channel 信号传输
空结构体
与 channel
可谓是一个经典组合,有时候我们只是需要一个信号来控制程序的运行逻辑,并不在意其内容如何。
(3)方法分组
有时为了业务的需要,需要将方法分组,易拓展,省空间,又结构化。
type groupA struct{}
type groupB struct{}
func (a groupA) f1(){
}
func (a groupA) f2(){
}
func (b groupB) f2(){
}
func (b groupB) f2(){
}