Golang 的 iota 是如何实现枚举的?

Golang 不支持内置的枚举类型,但可以使用 iota 模拟枚举。
具体实现方式如下:
一、 定义基础类型
使用 int 作为基础类型:

type Season int

二、 定义常量
使用常量声明枚举成员:

const (
    Spring Season = iota  // 0
    Summer                // 1
    Autumn                // 2
    Winter                // 3
)

这里 iota 用于给枚举成员赋值,初始值为 0,每增1。

三、iota的值
在下一个 const 中,iota 自动增1:

const (
    a = iota // 0 
    b        // 1
    c        // 2
)

const (
    d = iota // still 0,different const block
     e       // 1  
)

在同一个 const 块内部,iota 自动增1。

四、 _ 忽略iota
可以使用_忽略iota,保持不变:

const(
    a = iota // 0
    _        // still 0 
    b        // 1  
)

五、字符串值
可以给枚举值绑定字符串:

const ( 
    Monday = iota + "Monday "  
    Tuesday             +"Tuesday"
    Wednesday           +"Wednesday"
)

调用 .String() 方法:

fmt.Println(Monday.String()) // Monday

总的来说,Golang 使用 iota 模拟枚举实现包括:

  1. 基础类型
  2. 常量定义枚举成员
  3. iota 自动增1
  4. 使用_忽略iota
  5. 绑定字符串值
  6. 调用String()方法