记录 Go 中实现 Enum 的几种方法
Enum(枚举) 的特点
- 要有一个类型,以便类型检查,底层可以是各种类型(int/string)
- 类型内有多种备选项,备选项以名称表示意义,备选项对应的值外界无需知道
string 实现
package sex
type Sex string
const (
Man Sex = "man"
Woman Sex = "woman"
Other Sex = "other"
)
func func1(sex sex.Sex) {
if sex == sex.Man {
// ...
}
}
int 实现
package sex
type Sex int
const (
Man Sex = 0
Woman Sex = 1
Other Sex = 2
)
// 为了让 log 输出时更易读,可以增加对应的 String 函数
func (p Sex) String() string {
switch p {
case Man: return "man"
case Woman: return "woman"
case Other: return "other"
default: return "unknow"
}
}
time.Duration
就是类似上面的实现方式
在某些正好与数值相关的枚举中,还可以利用iota
:
package volume
type Volume uint64
const (
B Volume = 1 << (10 * iota)
KB
MB
GB
TB
PB
EB
)
- 由于 iota 生成的数字未确定类型,所以左边可以是任何类型的常量