使用 go generate 和 stringer 工具可以方便地自动生成常量的字符串表示形式

14 min read
type Color int

const (
    Red Color = iota
    Green
    Blue
)

我们可以在代码中添加以下注释来告诉 "go generate" 命令生成字符串表示形式的代码:

//go:generate stringer -type=Color
type Color int

const (
    Red Color = iota
    Green
    Blue
)

然后,在终端中执行以下命令:

$ go generate

这将使用 "stringer" 工具自动生成 Color 类型的字符串表示形式。生成的代码将会被保存在 color_string.go 文件中。在生成的代码中,我们可以看到 Color 类型的 String() 方法的实现:

func (i Color) String() string {
    names := [...]string{"Red", "Green", "Blue"}
    if i < Red || i > Blue {
        return fmt.Sprintf("Color(%d)", i)
    }
    return names[i]
}

生成的代码中包含一个 names 数组,它存储了所有常量的字符串表示形式。String() 方法根据常量的值返回相应的字符串。

在我们的代码中,我们现在可以使用 fmt.Println(Green) 来打印 "Green",而不需要手动编写将 Green 转换为字符串的代码。