【注意】最后更新于 February 10, 2019,文中内容可能已过时,请谨慎使用。
模拟枚举类型
go语言中虽然没有Java, C++等一些高级语言提供的枚举类型特性,但可以使用常量和iota来模拟。
例如:
1
2
3
4
5
6
7
8
9
10
11
|
// BuildResult 构建结果
type BuildResult int
const (
// Success 成功
Success BuildResult = iota
// Fail 失败
Fail
// Abort 中断
Abort
)
|
1
2
|
var buildResult = Success
println(buildResult) // 0
|
使用go generate和stringer生成String() string函数
为了打印枚举类型值具体的字符串标识,可以使用https://godoc.org/golang.org/x/tools/cmd/stringer
工具并结合go generate
为枚举类型生成func (t T) String() string
函数。这样枚举类型就实现了fmt.Stringer
接口。具体的实现方式是在枚举类型BuildResult的定义上加上注释//go:generate stringer -type=BuildResult
:
1
2
3
4
5
6
7
8
9
10
11
12
|
// BuildResult 构建结果
//go:generate stringer -type=BuildResult
type BuildResult int
const (
// Success 成功
Success BuildResult = iota
// Fail 失败
Fail
// Abort 中断
Abort
)
|
在生成代码前需要先按照stringer命令行工具go get -u golang.org/x/tools/cmd/stringer
,并将命令执行的$GOPATH/bin
配置到$PATH
环境变量下。
使用go generate
生成代码后,会生成源码buildresult_string.go
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
// Code generated by "stringer -type=BuildResult"; DO NOT EDIT.
package enums
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[Success-0]
_ = x[Fail-1]
_ = x[Abort-2]
}
const _BuildResult_name = "SuccessFailAbort"
var _BuildResult_index = [...]uint8{0, 7, 11, 16}
func (i BuildResult) String() string {
if i < 0 || i >= BuildResult(len(_BuildResult_index)-1) {
return "BuildResult(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _BuildResult_name[_BuildResult_index[i]:_BuildResult_index[i+1]]
}
|
使用生成的源码:
1
2
|
var buildResult = Success
println(buildResult.String()) // Success
|