你打印一个枚举,它使用“%v”来实现Stringer,它将打印它的字符串值。如果你在一个结构中声明了相同的枚举,并且使用“%v”来打印该结构,它将打印枚举的数值。有没有办法打印枚举字段的字符串值?
样品(https://play.golang.org/p/AP_tzzAZMI):
package main
import (
"fmt"
)
type MyEnum int
const (
Foo MyEnum = 1
Bar MyEnum = 2
)
func (e MyEnum) String() string {
switch e {
case Foo:
return "Foo"
case Bar:
return "Bar"
default:
return fmt.Sprintf("%d", int(e))
}
}
type MyStruct struct {
field MyEnum
}
func main() {
info := &MyStruct{
field: MyEnum(1),
}
fmt.Printf("%v\n", MyEnum(1))
fmt.Printf("%v\n", info)
fmt.Printf("%+v\n", info)
fmt.Printf("%#v\n", info)
}
图纸:
Foo
&{1}
&{field:1}
&main.MyStruct{field:1}
5条答案
按热度按时间tgabmvqs1#
需要将字段设为
exported
,即可以将结构声明为下面是一个包含
exported
和unexported
字段的示例程序代码
输出
这里是播放链接:https://play.golang.org/p/7knxM4KbLh
jvlzgdj92#
我将用这个方法对公认的答案进行一些扩展:
上面的代码假设枚举值从0开始,这很好地实现了,因为String方法中数组的第一个元素可以直接被枚举值引用。
但是原始问题中的第一个枚举值的值为1。我们可以相应地修改它的方法。
以下是播放链接:https://play.golang.org/p/6pmyVlsAeV2
wlwcrazw3#
使用
stringer
。它是Golang工具链中不可或缺的一部分,专门为此任务而制造。a14dhokn4#
你可能想使用godocs中提到的标准枚举器包:https://godoc.org/github.com/alvaroloes/enumer
附言:有一些叉子已经在上面的项目中工作过了。但是对于你的要求,这应该足够了。
txu3uszq5#
您所要做的就是在定义ENUM的类型上实现String方法
请看此示例