【问题标题】:What is idiomatic way to get string representation of enum in Go?在 Go 中获取枚举的字符串表示的惯用方法是什么?
【发布时间】:2019-03-27 10:32:00
【问题描述】:

如果我有一个枚举:

type Day int8

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

还有什么更自然 Go的方式来获取字符串呢?

功能:

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

或方法

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

【问题讨论】:

标签: go


【解决方案1】:

第二个更惯用,因为它满足Stringer接口。

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

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

它会让你写作。

fmt.Println(day)

并获取String方法产生的值。

【讨论】:

  • 谢谢,Grzegorz Żur。我按照这种方式。但还有另一种观点:如果我们不改变类型状态——最好声明函数。
  • @SergiiGetman 可以更好地解释这部分“我们不改变类型状态”吗?
  • Grzegorz Żur。我是新手,可能是错的。但想法是如果我们有类型,例如struct。我们有一些代码可以更改该结构,最好将其设为该类型的方法。如果我们只是use我们可以实现的类型
【解决方案2】:

您自己回答这个问题的简单方法是查看 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 方法 将作为操作数传递的值打印到任何接受 字符串或打印到未格式化的打印机,例如 Print。

type Stringer interface {
        String() string
}

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2017-08-07
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多