golang中的枚举类型

⚠️ golang 没有枚举类型

但是我们可以通过类型别名实现一个简单版本的 enmu

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

type LogLevel int

const (
    INFO LogLevel = iota
    WARNING
    ERROR
)

func (l LogLevel) String() string {
    s := []string{"INFO", "WARNING", "ERROR"}
    return s[l]
}

func test(level LogLevel) {
    fmt.Println(level)
}

func main() {
    test(ERROR)
}

我们可以为类型别名实现 String() 打印的时候 golang 会默认调用,所以打印出来是我们要的字符串值。

这里只是使用了类型别名。但是实际上还是 int 类型, 方法调用者还是能传其它的 int 值进来。 暂时没有好的解决办法

不过已经很好了,从方法的签名反应出类型的枚举值

使用 go:generate 自动生成 string 方法

如果每次都要自己写类型的string实现很容易出错,也很麻烦。 官方提供了 stringer 专门用来做这个事情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import "fmt"

type Pill int

const (
   Placebo Pill = iota
   Aspirin
   Ibuprofen
   Paracetamol
)

//go:generate stringer -type=Pill
func main() {
   fmt.Println("Hello, world.", Aspirin)
}

执行命令 go generate会自动为你生成 pill_string.go 实现 string() 方法

为什么 go 没有 enum 类型?

golang 的数据类型都有零值。 假如我们写了一个枚举类型的值是 [1,2,3,4,5] 那么他的零值是多少呢?