iota 枚举常量
隐式重复
Go 语言并没有提供定义枚举常量的语法。但 const 语法提供了隐式重复前一个非空表达式的机制。
const (
Apple, Banana = 11, 22
Strawberry, Grape
Pear, Watermelon
)
常量定义中如不提供初始值,则表示将使用上行的表达式。上面的代码等价于:
const (
Apple, Banana = 11, 22
Strawberry, Grape = 11, 22
Pear, Watermelon = 11, 22
)
不过这显然无法满足枚举的要求,不过 Go 语言提供了 iota
,有了它就可以定义满足各种场景的枚举常量。
iota 枚举
iota
是 Go 语言的一个预定义标识符,可以认为是一个可以被编译器修改的常量,同时也是无类型常量。
const (
mutexLocked = 1 << iota // mutexLocked == 1
mutexWoken // mutexWoken == 2
mutexStarving // mutexStarving == 4
mutexWaiterShift = iota // mutexWaiterShift == 3
starvationThresholdNs = 1e6
)
位于同一行的 iota
即便出现了很多次,其值也是一样的。
const (
Apple, Banana = iota + 1, iota + 2 // Apple == 1, Banana == 2
Strawberry, Grape // Strawberry == 2, Grape == 3
Pear, Watermelon // Pear == 3, Watermelon == 4
)
如果要略过 iota = 0
的值,可以使用空白标识符 _
。可以效仿下面的代码:
const (
_ = iota
IPV6_V6ONLY // 1
SOMAXCONN // 2
SO_ERROR // 3
)
也可以用类似的方式,略过某一枚举值:
const (
Apple = iota // 0
_
Banana // 2
_
Strawberry // 4
)
iota
的加入让 Go 在枚举常量定义上的表达力大增:
iota
预定义标识符能够以更灵活的形式为枚举常量赋初值;- Go 的枚举常量不限于整数型,也可以定义浮点型的枚举常量;
iota
使得维护枚举常量列表更容易- 使用有类型的枚举常量保证类型安全