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. }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值