Go Enumerations

From NovaOrdis Knowledge Base
Revision as of 20:07, 13 September 2024 by Ovidiu (talk | contribs) (→‎Overview)
Jump to navigation Jump to search

External

Internal

Overview

Go does not have formal enums, but the language allows for sets of related, yet distinct int constants. They represent a property that has several distinct possible int values, like the days of the weeks or the months of the year.

These auto-incrementing int constants are declared using a special syntax involving the const keyword, parentheses, a type and the pre-declared constant iota:

type SomeType int

const (
  UndefinedEnum SomeType = iota
  EnumOne
  EnumTwo
  ...
)

This article explains how iota is used to generate values for enumeration members:

How Does the Compiler Assign Values to iota

The short story is that iota takes the zero-based index of the constant declaration, as it appears in the const() list.

Example:

type DayOfTheWeek int
const (
  MON DayOfTheWeek = iota
  TUE
  WED
  THU
  FRI
  SAT
  SUN
)

Only the first constant in the series declares its type and an expression involving iota. The simplest is iota itself, but more complex expressions can be used. During the initialization, the compiler advances through the list of constants, and for each advancement, iota takes the zero-based line number at which iota is declared in the const() sequence. This behavior is explained here.

type ByteSize float64
const (
  _           = iota // ignore the first value, which is zero, by assigning it to a blank identifier
  KB ByteSize = 1 << (10 * iota)
  MB
  GB
  TB
  PB
  EB
  ZB
  YB
)

To make the enumeration constants visible outside the package, they need to start with a capital letter.

String Representation

const enums can take advantage go the possibility of attaching a String() method to any type, including the enum type, to provide a string representation.

type DayOfTheWeek int

const (
	MON DayOfTheWeek = iota
	TUE
	WED
	THU
	FRI
	SAT
	SUN
)

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

func (s DayOfTheWeek) String() string {
	return dayOfTheWeekToString[s]
}

func StringToDayOfTheWeek(s string) DayOfTheWeek {
	for i, v := range dayOfTheWeekToString {
		if s == v {
			return DayOfTheWeek(i)
		}
	}
	return DayOfTheWeek(-1)
}