转投go系列-go语言需要注意的地方-结构体字段顺序对其

本文探讨了Go语言中结构体字段对齐的问题,指出不合理的字段顺序可能导致额外的内存开销。在64位系统上,内存分配遵循特定规则,导致空间浪费。解决方案是调整结构体字段顺序,确保按大小排列。推荐使用fieldalignment工具辅助优化。通过调整,例如将较小的字段放在最后,可以减少 AuditTaskTemplateDetail 类型的内存占用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现公司代码很多人定义结构体的时候不注意字段对其
如下:

type AuditTaskTemplateDetail struct {
	IsTemplate   bool          `json:"isTemplate"` //1 byte
	TemplateName string        `json:"templateName"` //16 byte
	BatchCount   int32           `json:"batchCount"` //4 byte
}


看起来上面好像占用的空间都是 21字节,但是结果却不是这样。如果使用 GOARCH=amd64 编译代码,发现 AuditTaskTemplateDetail 类型占用 32 个字节,因为数据结构对齐,感兴趣的可以搜搜。在 64 位体系结构中,内存分配连续的 8 字节数据,所以不对齐的会被自动填充。
那么如何定义才是最好的,下面就是答案:

type AuditTaskTemplateDetail struct {
	TemplateName string        `json:"templateName"` //16 byte
	BatchCount   int32           `json:"batchCount"` //4 byte
	IsTemplate   bool          `json:"isTemplate"` //1 byte
}

当然,调整struct有工具叫fieldalignment,具体使用方法可以看看这篇文章。

手摸手Go 你的内存对齐了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值