在运行中,我可以使用stringer将const名称转换为字符串:

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

const (
    _ M = iota
    Foo // "Foo"
    Bar // "Bar"
)

除了手写开关,是否有什么可以让我将"foo"字符串转换为M类型的变量的?

最佳答案

找到了一种方法,但是仍然是半手工的。通过使用纵梁创建的映射 slice ,还可以搜索它来反转操作:

type Measurement int

const (
    invalidMeasurement Measurement = iota
    Meters
    Liters
    Pounds
)

// Works with golang.org/x/tools/cmd/stringer
// v0.0.0-20200925191224-5d1fdd8fa346
func UnString(s string) Measurement {
    s = strings.ToLower(s)
    l := strings.ToLower(_Measurement_name)
    for i := 0; i < len(_Measurement_index)-1; i++ {
        if s == l[_Measurement_index[i]:_Measurement_index[i+1]] {
            return Measurement(i)
        }
    }
    //
    return Measurement(0)
}

10-04 13:44