Go语言空结构体是什么
导读:本文共3204.5字符,通常情况下阅读需要11分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 什么是空结构体我们说不包含任何字段的结构体叫做空结构体,可以通过如下的方式定义空结构体:原生定义varastruct{}类型别名typeemptystruct{}vareempty特点地址相同我们分别定义两个非空结构体和空结构体变量,然后取地址打印,发现空结构体变量的地址是相同的://定义一个非空结构体typeUserstruct{namestring}... ...
目录
(为您整理了一些要点),点击可以直达。我们说不包含任何字段的结构体叫做空结构体,可以通过如下的方式定义空结构体:
原生定义
类型别名
我们分别定义两个非空结构体和空结构体变量,然后取地址打印,发现空结构体变量的地址是相同的:
我们知道 Go 语言中的变量传递都是值传递,对于传参前后的变量地址应该不同,我们通过传参的方式再来试一下:
发现对于非空结构体,传参前后的地址是不同的,但是对于空结构体变量,前后地址是一致的。
在Go中,我们可以使用 unsafe.Sizeof 来计算一个变量占用的字节数,那么就举几个例子来看下:
可以看到空结构体占用的内存空间大小为0,同时对于空结构体的组合,占用空间大小也为0:
为什么空结构体的地址都相同,而且大小都为0呢,我们一起来看下源码(go/src/runtime/malloc.go):
通过源码可以看出,创建新的对象时,需要调用 malloc.newobject() 进行内存分配,进一步调用 mallocgc 方法,在该方法中,如果判断类型的 size==0 ,固定返回 zerobase 的地址。 zerobase 是一个 uintptr 全局变量,占用 8 个字节。
因此我们可以确定的是,在Go语言中,所有针对 size==0 的内存分配,用的都是同一个地址 &zerobase ,所以我们在一开始看到的所有空结构体地址都相同。
空结构体不包含任何数据,那么其应用场景也应该不在乎值内容,只当做一个占位符。在这种场景下,由于其不占用内存空间,使用空结构体既可以做到节省空间,又可以提供语义支持。
使用过 Java 的同学应该都用过 Set 类型,Set 是保存不重复元素的集合,但是 Go 语言没有提供原生的 Set 类型。但是我们知道 Map 结构存储的是 key-value 类型,key 不允许重复,因此可以利用 Map 来实现 Set,key存储需要的数据,value 给个固定值就可以了。那么 value 给什么值好呢?这时候我们的 空结构体 就可以出场了,不占用空间,还可以完成占位操作,堪称完美,下面我们看怎么实现吧。
空结构体 与 channel 可谓是一个经典组合,有时候我们只是需要一个信号来控制程序的运行逻辑,并不在意其内容如何。
在下面的例子中,我们定义了两个 channel 用于接收两个任务完成的信号,当接收到任务完成的信号时,就会触发相应的动作。
Go语言空结构体是什么的详细内容,希望对您有所帮助,信息来源于网络。