在Go中获取枚举的字符串表示形式的惯用方式是什么?

时间:2018-10-23 08:43:35

标签: go

如果我有一个枚举:

with()

还有什么 natural Go 方法来获取字符串?

功能:

type Day int8

const (
    Monday Day = iota
    Tuesday
    ...
    Sunday
)

或方法

func ToString(day Day) string {
   ...
}

2 个答案:

答案 0 :(得分:9)

第二个更习惯,因为它满足Stringer界面。

func (day Day) String() string  {
    ... 
}

因为我们没有更改值,所以我们以Day类型而不是*Day类型声明此方法。

它将使您能够书写。

fmt.Println(day)

并获取由String方法产生的值。

答案 1 :(得分:4)

您自己回答此问题的简单方法是查看Go标准库。


  

Package time

import "time" 
     

type Weekday

     

工作日指定一周中的一天(星期日= 0,...)。

type Weekday int

const (
        Sunday Weekday = iota
        Monday
        Tuesday
        Wednesday
        Thursday
        Friday
        Saturday
)
     

func(工作日)字符串

func (d Weekday) String() string
     

String返回当天的英文名称(“ Sunday”,“ Monday”,...)。

src/time/time.go

// A Weekday specifies a day of the week (Sunday = 0, ...).

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

var days = [...]string{
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
}

// String returns the English name of the day ("Sunday", "Monday", ...).
func (d Weekday) String() string {
    if Sunday <= d && d <= Saturday {
        return days[d]
    }
    buf := make([]byte, 20)
    n := fmtInt(buf, uint64(d))
    return "%!Weekday(" + string(buf[n:]) + ")"
}

  

Package fmt

import "fmt" 
     

type Stringer

     

Stringer由具有String方法的任何值实现,   定义该值的“本机”格式。使用String方法   打印作为操作数传递的值,使其接受任何格式   字符串或未格式化的打印机(例如“打印”)。

type Stringer interface {
        String() string
}