Go 并没有关键字 enum 来定义枚举类型,引入枚举的标准方法是声明一个自定义类型和一个使用了自增器 iota 的 const 组来表示枚举值。
预先声明的标识符 iota 表示连续的非类型化整数常量,它的值是对应常量的下标(从零开始),它可用于构造一组相关常数:
type ByteSize float64
const (
_ = iota // ignore first value by assigning to blank identifier
KB ByteSize = 1 << (10 * iota)
MB
GB
TB
PB
EB
ZB
YB
)
由于第一个值从 0 开始,如果需要使第一个值为有意义的值,我们应该从 1 开始。
// Bad
type Operation int
const (
Add Operation = iota
Subtract
Multiply
)
// Add=0, Subtract=1, Multiply=2
// Good
type Operation int
const (
Add Operation = iota + 1
Subtract
Multiply
)
// Add=1, Subtract=2, Multiply=3
当然,凡事无绝对。如果第一个枚举值为零是有意义的,如当零值是理想的默认行为时。
type LogOutput int
const (
LogToStdout LogOutput = iota
LogToFile
LogToRemote
)
// LogToStdout=0, LogToFile=1, LogToRemote=2