Какой идиоматический способ получить строковое представление enum в Go? - PullRequest
0 голосов
/ 23 октября 2018

Если у меня есть перечисление:

type Day int8

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

Что еще натуральный Перейти способ получить строку этого?

функция:

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

или метод

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

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Простой способ ответить на этот вопрос самостоятельно - взглянуть на стандартную библиотеку Go.


Время упаковки

import "time" 

тип Weekday

A Weekday указывает день недели (воскресенье = 0, ...).

type Weekday int

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

func (Weekday) Строка

func (d Weekday) String() string

Строка возвращает английское название дня («Воскресенье», «Понедельник», ...).

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:]) + ")"
}

Пакет fmt

import "fmt" 

тип Stringer

Stringer реализуется любым значением, имеющим метод String, которыйопределяет «родной» формат для этого значения.Метод String используется для печати значений, переданных в качестве операнда, в любой формат, который принимает строку, или на неформатированный принтер, например Print.

type Stringer interface {
        String() string
}
0 голосов
/ 23 октября 2018

Второй вариант более идиоматичен, поскольку удовлетворяет интерфейсу Stringer .

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

Мы объявляем этот метод для типа Day, а не для типа *Day, поскольку мы не меняемсязначение.

Это позволит вам написать.

fmt.Println(day)

и получить значение, полученное методом String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...