【Go 语言神器】iota 到底是什么?为什么高手都爱用它?
【Go 语言神器】iota 到底是什么?为什么高手都爱用它?
你是不是在看 Go 源码时,经常看到一个奇怪的词 —— iota
?
它看起来像个变量,却又不能赋值;像个常量,却会自动变。
今天,我就来给你彻底讲透 iota 的本质、用法,以及为什么它是 Go 语言中最被低估的“神器”之一。
1. 它到底是什么?
一句话解释:
iota
是 Go 语言里的常量计数器,在同一个const
声明块中从 0 开始自动递增。
简单说,就是编译器帮你自动生成连续的常量值,你不用自己一个个写数字。
2. 最常见的用法:枚举
不用 iota
,你可能会这样写:
const (
Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
)
这样写的问题:
- 插入或删除一行,后面的数字全要改
- 容易写错,可读性差
用 iota
,直接这样:
const (
Sunday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
✅ 好处:
- 顺序调整不影响编号
- 代码简洁,易维护
- 出错率几乎为零
3. 进阶用法:位掩码(Bitmask)
位掩码常用于权限控制、选项组合等场景。
不用 iota
:
const (
Read = 1 // 001
Write = 2 // 010
Exec = 4 // 100
)
用 iota
:
const (
Read = 1 << iota // 1 << 0 = 1
Write // 1 << 1 = 2
Exec // 1 << 2 = 4
)
✅ 好处:
- 不用手动算 1、2、4、8、16…
- 顺序调整不会影响值的正确性
4. 黑科技:常量表达式 + iota
iota
可以参与任意常量表达式,比如定义存储单位:
const (
_ = iota // 0,丢弃
KB = 1 << (10 * iota) // 1 << 10 = 1024
MB // 1 << 20 = 1048576
GB // 1 << 30
)
以后要加 TB
、PB
,直接加一行就行,自动计算。
5. 重置与中断
iota
在每个 const
块都会从 0 重新计数:
const (
A = iota // 0
B // 1
)
const (
X = iota // 0(重置)
Y // 1
)
如果中途手动赋值,iota
会继续按行号计数:
const (
P = iota // 0
Q // 1
R = 100 // 手动赋值
S = iota // 3
)
6. 为什么高手都爱用 iota?
- 代码简洁:不用写一堆数字
- 可读性高:意图一目了然
- 易于维护:插入/删除常量不影响编号
- 不易出错:编译器自动生成,避免手误
7. 总结
iota
就是 Go 官方提供的自动递增常量生成器,最适合用来写枚举、位掩码和有规律的常量集合。
掌握 iota
,你的 Go 代码会更短、更安全、更专业。
最后的小建议:
以后写 Go 代码,只要看到连续数字常量,先想想能不能用 iota
替代,这是高手和新手的一个明显区别。
Don’t reinvent the wheel, library code is there to help.
欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。
你要保守你心,胜过保守一切。
本文来自博客园,作者:刘俊涛的博客,转载请注明原文链接:https://www.cnblogs.com/lovebing/p/19133590