Go 如何打印“的字符串表示形式”;“枚举”;在围棋中?

Go 如何打印“的字符串表示形式”;“枚举”;在围棋中?,go,enums,printf,Go,Enums,Printf,我查看了各种官方来源,了解如何做到这一点,但我找不到。假设您有以下枚举(我知道golang没有经典意义上的枚举): 使用上面的%s可以得到的最接近的值,它给出了: Log Level: %!s(main.LogLevel=1) 我希望: Log Level: Debug 有人能帮我吗?您不能直接使用该语言,但有一个生成支持代码的工具: 从stringer文档中的示例 type Pill int const ( Placebo Pill = iota Aspirin

我查看了各种官方来源,了解如何做到这一点,但我找不到。假设您有以下枚举(我知道golang没有经典意义上的枚举):

使用上面的
%s
可以得到的最接近的值,它给出了:

Log Level: %!s(main.LogLevel=1)
我希望:

Log Level: Debug

有人能帮我吗?

您不能直接使用该语言,但有一个生成支持代码的工具:

stringer
文档中的示例

type Pill int

const (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
    Acetaminophen = Paracetamol
)
将生成类似于

const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"

var _Pill_index = [...]uint8{0, 7, 14, 23, 34}

func (i Pill) String() string {
    if i < 0 || i+1 >= Pill(len(_Pill_index)) {
        return fmt.Sprintf("Pill(%d)", i)
    }
    return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}
const\u Pill\u name=“placeboaspirinibuprofenpacetamol”
var_Pill_index=[…]uint8{0,7,14,23,34}
func(i)String()字符串{
如果i<0 | | i+1>=丸(len(_丸_指数)){
返回fmt.Sprintf(“药丸(%d)”,i)
}
return\u Pill\u name[\u Pill\u index[i]:\u Pill\u index[i+1]]
}
这对我很有用:


级别\u str=fmt.SPrintf(“%s”,级别)

此代码的可能副本非常脆弱,无法解决干燥问题。如果你想朝这个方向走,最好有一个显式的、简单的
String()
方法,每个常量都有一个开关。@ZephaniahGrunschlag:这就是这个例子的作用;它生成一个简单的字符串方法,除非您不必自己维护它,甚至不必查看生成的代码。使用
stringer
包在go项目中相当常见。它并不打算创建一个真正的枚举,String()输出并不用于任何比较或验证,它只是一种创建人类可读输出的方便方法。你不需要否决一个答案,因为你不喜欢围棋社区选择的解决方案。
const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"

var _Pill_index = [...]uint8{0, 7, 14, 23, 34}

func (i Pill) String() string {
    if i < 0 || i+1 >= Pill(len(_Pill_index)) {
        return fmt.Sprintf("Pill(%d)", i)
    }
    return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}