Go 中的 iota
iota 是 Go 语言中的常量计数器,只能在 const 声明块中使用。
每进入一个 const 块,iota 的值都会从 0 开始,每新增一行常量声明自动加 1。
基本用法
const (
A = iota
B
C
D
)
结果:
A = 0
B = 1
C = 2
D = 3
等价于:
const (
A = 0
B = 1
C = 2
D = 3
)
每个 const 块独立计数
const (
A = iota
B
)
const (
C = iota
D
)
结果:
A = 0
B = 1
C = 0
D = 1
跳过某些值
使用空白标识符 _:
const (
A = iota
_
C
D
)
结果:
A = 0
C = 2
D = 3
定义枚举
Go 没有真正的 enum,通常使用 iota 模拟枚举。
const (
StatusPending = iota
StatusRunning
StatusSuccess
StatusFailed
)
结果:
StatusPending = 0
StatusRunning = 1
StatusSuccess = 2
StatusFailed = 3
从 1 开始
const (
A = iota + 1
B
C
)
结果:
A = 1
B = 2
C = 3
位运算
经常用于权限定义。
const (
Read = 1 << iota
Write
Execute
)
计算过程:
Read = 1 << 0 = 1
Write = 1 << 1 = 2
Execute = 1 << 2 = 4
结果:
Read = 1
Write = 2
Execute = 4
连续位标志
const (
FlagA = 1 << iota // 1
FlagB // 2
FlagC // 4
FlagD // 8
)
结果:
FlagA = 1
FlagB = 2
FlagC = 4
FlagD = 8
组合使用:
permission := FlagA | FlagC
结果:
permission = 5
同一行多个常量
const (
A, B = iota, iota
C, D
)
结果:
A = 0
B = 0
C = 1
D = 1
iota 与表达式
const (
KB = 1 << (10 * iota)
MB
GB
TB
)
结果:
KB = 1024
MB = 1048576
GB = 1073741824
TB = 1099511627776
这是 Go 源码中常见的写法。
总结
iota 本质上是一个在 const 块内自动递增的整数计数器:
0 → 1 → 2 → 3 → ...
常见用途:
- 定义枚举值
- 跳号常量
- 位标志(权限控制)
- 数据单位(KB、MB、GB)
- 自动生成连续常量
最常见的两种写法:
// 枚举
const (
Pending = iota
Running
Success
Failed
)
// 权限位
const (
Read = 1 << iota
Write
Execute
)