Go Enum

记录 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 生成的数字未确定类型,所以左边可以是任何类型的常量