将字符串解析为枚举的最佳方法

prn*_*vbn 7 enums go

我有一个枚举如下

type Capability int

const (
    Read   Capability = iota // Read   = 0
    Create                   // Create = 1
    Update                   // Update = 2
    Delete                   // Delete = 3
    List                     // List   = 4
)
Run Code Online (Sandbox Code Playgroud)

我希望能够从枚举中获取字符串表示形式以及解析字符串以获取枚举。

我从枚举中获取字符串,如下所示。


capabilityStrs := []string{"read", "create", "update", "delete", "list"}
func (c Capability) String() string {
    return capabilityStrs[c]
}

Run Code Online (Sandbox Code Playgroud)

如何将字符串解析为枚举以便调用ParseSTring("read") gives me Read`. 解决这个问题的最佳方法是什么?

prn*_*vbn 9

根据@super的评论回答

var (
    capabilitiesMap = map[string]Capability{
        "read":   Read,
        "create": Create,
        "update": Update,
        "delete": Delete,
        "list":   List,
    }
)
func ParseString(str string) (Capability, bool) {
    c, ok := capabilitiesMap[strings.ToLower(str)]
    return c, ok
}

Run Code Online (Sandbox Code Playgroud)

  • 将地图移出函数。您不需要每次都重新初始化它。 (3认同)

JBa*_*aoz 5

这比最佳答案更好,因为如果您有大量枚举,则不必将列表写出两次(与最佳答案不同):

package usstates

type USState int

//go:generate stringer -type=USState
const (
    Alabama USState = iota
    Alaska
    Arizona
    Arkansas
    California
    Colorado
    Connecticut
    Delaware
    Florida
    Georgia
    Hawaii
    Idaho
    Illinois
    Indiana
    Iowa
    Kansas
    Kentucky
    Louisiana
    Maine
    Maryland
    Massachusetts
    Michigan
    Minnesota
    Mississippi
    Missouri
    Montana
    Nebraska
    Nevada
    NewHampshire
    NewJersey
    NewMexico
    NewYork
    NorthCarolina
    NorthDakota
    Ohio
    Oklahoma
    Oregon
    Pennsylvania
    RhodeIsland
    SouthCarolina
    SouthDakota
    Tennessee
    Texas
    Utah
    Vermont
    Virginia
    Washington
    WestVirginia
    Wisconsin
    Wyoming
)

var MapEnumStringToUSState = func() map[string]USState {
    m := make(map[string]USState)
    for i := Alabama; i <= Wyoming; i++ {
        m[i.String()] = i
    }
    return m
}()
Run Code Online (Sandbox Code Playgroud)