golang 空结构体struct{}解析

Introduction

这篇文章详细介绍了我最喜欢的Go数据类型,空结构体—struct{}。

空结构体是没有位段的结构体,以下是空结构体的一些例子:

 
 
 
   
   
   
   
  1. type Q struct{}
  2. var q struct{}

但是如果一个就结构体没有位段,不包含任何数据,那么他的用处是什么?我们能够利用空结构体完成什么任务?

Width

在深入研究空结构体之前,我想先简短的介绍一下关于结构体宽度的知识。

术语宽度来自于gc编译器,但是他的词源可以追溯到几十年以前。

宽度描述了存储一个数据类型实例需要占用的字节数,由于进程的内存空间是一维的,我更倾向于将宽度理解为Size(这个词实在不知道怎么翻译了,请谅解)。

宽度是数据类型的一个属性。Go程序中所有的实例都是一种数据类型,一个实例的宽度是由他的数据类型决定的,通常是8bit的整数倍。

我们可以通过unsafe.Sizeof()函数获取任何实例的宽度:

 
 
 
   
   
   
   
  1. var s string
  2. var c complex128
  3. fmt.Println(unsafe.Sizeof(s)) // prints 8
  4. fmt.Println(unsafe.Sizeof(c)) // prints 16

http://play.golang.org/p/4mzdOKW6uQ

数组的宽度是他元素宽度的整数倍。

 
 
 
   
   
   
   
  1. var a [3]uint32
  2. fmt.Println(unsafe.Sizeof(a)) // prints 12

结构体提供了定义组合类型的灵活方式,组合类型的宽度是字段宽度的和,然后再加上填充宽度。

 
 
 
   
   
   
   
  1. type S struct {
  2. a uint16
  3. b uint32
  4. }

你可能感兴趣的:(struct,go,结构)