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

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  {
    ... 
}
go


Solution 1:[1]

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
}

Solution 2:[2]

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.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 mourya venkat