Go 语言
声明、类型、语句与控制结构
iota 枚举常量

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 使得维护枚举常量列表更容易
  • 使用有类型的枚举常量保证类型安全