如何使 Go 将枚举字段打印为字符串?

新手上路,请多包涵

您打印一个使用“%v”实现 Stringer 的枚举,它将打印其字符串值。如果您在结构中声明相同的枚举并使用“%v”打印该结构,它将打印枚举的数值。有没有办法打印枚举字段的字符串值?

示例( https://play.golang.org/p/AP_tzzAZMI ):

 package main

import (
    "fmt"
)

type MyEnum int

const (
    Foo MyEnum = 1
    Bar MyEnum = 2
)

func (e MyEnum) String() string {
    switch e {
    case Foo:
        return "Foo"
    case Bar:
        return "Bar"
    default:
        return fmt.Sprintf("%d", int(e))
    }
}

type MyStruct struct {
    field MyEnum
}

func main() {
    info := &MyStruct{
        field: MyEnum(1),
    }
    fmt.Printf("%v\n", MyEnum(1))
    fmt.Printf("%v\n", info)
    fmt.Printf("%+v\n", info)
    fmt.Printf("%#v\n", info)
}

印刷:

 Foo
&{1}
&{field:1}
&main.MyStruct{field:1}

原文由 Igor Gatis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

您需要制作字段 exported ,即您可以将结构声明为

type MyStruct struct {
    Field MyEnum
}

这是一个带有 exportedunexported 字段的示例程序

代码

package main

import (
    "fmt"
)

type MyEnum int

const (
    Foo MyEnum = 1
    Bar MyEnum = 2
)

func (e MyEnum) String() string {
    switch e {
    case Foo:
        return "Foo"
    case Bar:
        return "Bar"
    default:
        return fmt.Sprintf("%d", int(e))
    }
}

type MyStruct struct {
    Field1 MyEnum
    field2 MyEnum
}

func main() {
    info := &MyStruct{
        Field1: MyEnum(1),
        field2: MyEnum(2),
    }
    fmt.Printf("%v\n", MyEnum(1))
    fmt.Printf("%v\n", info)
    fmt.Printf("%+v\n", info)
    fmt.Printf("%#v\n", info)
}

输出

Foo
&{Foo 2}
&{Field1:Foo field2:2}
&main.MyStruct{Field1:1, field2:2}

这是播放链接:https: //play.golang.org/p/7knxM4KbLh

原文由 Sarath Sadasivan Pillai 发布,翻译遵循 CC BY-SA 3.0 许可协议

我将使用这种方法稍微扩展已接受的答案:

 type MyEnum int

const (
    Foo MyEnum = iota
    Bar
)

func (me MyEnum) String() string {
    return [...]string{"Foo", "Bar"}[me]
}

// ...

fmt.Println(Foo, Bar)  // Prints: Foo Bar

上面的代码假设枚举值从 0 开始,这很好,因为方法 String 中数组中的第一个元素可以直接被枚举值引用。

但是原题中的第一个枚举值是1,我们可以相应修改方法。

 const (
    Foo MyEnum = iota + 1
    Bar
)

func (me MyEnum) String() string {
    return [...]string{"", "Foo", "Bar"}[me]
}

这是播放链接:https: //play.golang.org/p/6pmyVlsAeV2

原文由 Cybersam 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题