Go中没有直接的枚举类型,但可以通过conts和iota来模拟枚举。
传统的枚举实现
const (
Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
)
这种方式不直观,可读性差。
使用iota实现枚举
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
iota会自动累加生成序列常量,这种方式很直观。
值iota自动填充
const (
_ = iota
Sunday //1
_
Tuesday //3
)
自定义iota起始值
const (
StartAt = iota + 1 //1
Sunday //2
Monday //3
)
多个iota定义
const (
A = iota //0
B //1
C = iota //2
D //3
)
const (
A = iota // 0
B // 1
)
const (
C = iota // 0 (因为新的const块,iota重新开始计数)
D // 1
)
位运算模拟位掩码
const (
Read = 1 << iota // 1
Write // 2
Execute // 4
)
iota 初始值是 0,然后它被位移操作符 « 逐渐左移一位,即 1 « 0、1 « 1、1 « 2 等。这会使得 Read 的值为 1、Write 的值为 2,而 Execute 的值会是 4。
具体来说:
- Read 对应的二进制是 001,左移 0 位,值为 1。
- Write 对应的二进制是 010,左移 1 位,值为 2。
- Execute 对应的二进制是 100,左移 2 位,值为 4。
字符串类型枚举
const (
Unknown = "UNKNOWN"
Male = "MALE"
Female = "FEMALE"
)
Go中,iota 用于自动递增生成常量序列的枚举器,只能用于整数类型,如果想对字符串枚举,不能使用 iota。