Jim*_*imB 9

您不能直接使用该语言,但有一个生成支持代码的工具:golang.org/x/tools/cmd/stringer

stringer
type Pill int

const (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
    Acetaminophen = Paracetamol
)
Run Code Online (Sandbox Code Playgroud)

会产生类似的代码

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]]
}
Run Code Online (Sandbox Code Playgroud)
  • @ZephaniahGrunschlag:这就是这个例子的作用; 它生成一个简单的String方法,除了你不必自己维护它,甚至看看生成的代码.使用`stringer`包在go项目中相当常见.它并不打算创建一个真正的枚举,String()输出不用于任何比较或验证,它只是一种创建人类可读输出的方便方法.您不需要回答问题,因为您不喜欢Go社区选择的解决方案. (6认同)
  • 这是非常脆弱的代码,并且不能解决 DRY 问题。如果您打算朝这个方向发展,不妨使用一个显式且简单的“String()”方法,并为每个 const 提供一个开关。 (2认同)