What is idiomatic way to get string representation of enum in Go?

Viewed 3554

If I have an enum:

type Day int8

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

What is more natural Go way to get string of it?

fucntion:

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

or method

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

The second one is more idiomatic because it satisfies Stringer interface.

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

We declare this method on the Day type not *Day type because we are not changing the value.

It will enable you to write.

fmt.Println(day)

and get the value produced by String method.

The easy way for you to answer this question yourself is to look at the Go standard library.


Package time

import "time" 

type Weekday

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

type Weekday int

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

func (Weekday) String

func (d Weekday) String() string

String returns the English name of the day ("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 is implemented by any value that has a String method, which defines the “native” format for that value. The String method is used to print values passed as an operand to any format that accepts a string or to an unformatted printer such as Print.

type Stringer interface {
        String() string
}

Maybe my answer might have performance hit but when working with a huge set of enums, having a mapping would be a terrible ideatype Category string

type Category string

const (
    AllStocks        Category = "all"
    WatchList        Category = "watch_list"
    TopGainer        Category = "top_gainer_stock"
    TopLoser         Category = "top_loser_stock"
    FiftyTwoWeekHigh Category = "high_stocks"
    FiftyTwoWeekLow  Category = "low_stocks"
    HotStocks        Category = "hot_stock"
    MostTraded       Category = "most_active_stock"
)

func (c Category) toString() string {
    return fmt.Sprintf("%s", c)
}

This is the easiest string formatting route for enums.

Related