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

时间:2017-01-05 08:43:37

标签: go enums

使用"%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}

4 个答案:

答案 0 :(得分:8)

您需要创建字段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

答案 1 :(得分:2)

使用stringer。它是 Golang 工具链的一个组成部分,专门为此任务而制作。

答案 2 :(得分:1)

通过这种方法,我将对接受的答案进行一些扩展:

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

答案 3 :(得分:0)

您可能要使用godocs中提到的标准枚举程序包:https://godoc.org/github.com/alvaroloes/enumer

PS:上面的项目中有一些分叉。但是对于您的要求,这应该足够了。