在Golang中,是否可以获取枚举名称而不创建String()函数?

14

在Golang中,是否有可能获取枚举名称而无需创建func (TheEnum) String() string函数?

const (
 MERCURY = 1
 VENUS = iota
 EARTH
 MARS
 JUPITER
 SATURN
 URANUS
 NEPTUNE
 PLUTO
)

是否有一种方法可以动态定义常量?我找到了两种方法基于结构体的基于字符串的,但这两种方法都要求我们再输入标签1次(或复制-粘贴并引用或使用编辑器宏)。


2个回答

21
据我所知,你不能不将名称显式地作为字符串键入而做到那样。但是,你可以使用标准工具包中的 stringer 工具 为你完成操作:

例如,给定以下代码片段:

package painkiller

type Pill int

const (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
    Acetaminophen = Paracetamol
)
运行此命令。
stringer -type=Pill

在同一个目录下创建名为pill_string.go的文件,位于painkiller包中,其中包含一项定义。

func (Pill) String() string

推荐在Go 1.4+的go generate命令中使用。


1
作为补充:
在代码中使用以下注释可以帮助go generate知道要生成什么。 注意,//go:generate之间没有空格。
//go:generate stringer -type=Pill
type Pill int

const (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
    Acetaminophen = Paracetamol
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接