Introduction
这篇文章详细介绍了我最喜欢的Go数据类型,空结构体—struct{}。
空结构体是没有位段的结构体,以下是空结构体的一些例子:
type Q struct{}
var q struct{}
但是如果一个就结构体没有位段,不包含任何数据,那么他的用处是什么?我们能够利用空结构体完成什么任务?
Width
在深入研究空结构体之前,我想先简短的介绍一下关于结构体宽度的知识。
术语宽度来自于gc编译器,但是他的词源可以追溯到几十年以前。
宽度描述了存储一个数据类型实例需要占用的字节数,由于进程的内存空间是一维的,我更倾向于将宽度理解为Size(这个词实在不知道怎么翻译了,请谅解)。
宽度是数据类型的一个属性。Go程序中所有的实例都是一种数据类型,一个实例的宽度是由他的数据类型决定的,通常是8bit的整数倍。
我们可以通过unsafe.Sizeof()函数获取任何实例的宽度:
var s string
var c complex128
fmt.Println(unsafe.Sizeof(s)) // prints 8
fmt.Println(unsafe.Sizeof(c)) // prints 16
http://play.golang.org/p/4mzdOKW6uQ
数组的宽度是他元素宽度的整数倍。
var a [3]uint32
fmt.Println(unsafe.Sizeof(a)) // prints 12
结构体提供了定义组合类型的灵活方式,组合类型的宽度是字段宽度的和,然后再加上填充宽度。
type S struct {
a uint16
b uint32
}