Go Enumerations: Difference between revisions
Line 11: | Line 11: | ||
Go does not have formal enums, but the language allows for sets of related, yet distinct <code>int</code> constants. They represent a property that has several distinct possible <code>int</code> values, like the days of the weeks or the months of the year. | Go does not have formal enums, but the language allows for sets of related, yet distinct <code>int</code> constants. They represent a property that has several distinct possible <code>int</code> values, like the days of the weeks or the months of the year. | ||
These auto-incrementing <code>int</code> constants are declared using a special syntax involving the <code>const</code> keyword, parentheses and the [[Go_Language#Pre-Declared_Constants|pre-declared constant]] <code>[[Go_iota|iota]]</code>: | These auto-incrementing <code>int</code> constants are declared using a special syntax involving the <code>const</code> keyword, parentheses, a type and the [[Go_Language#Pre-Declared_Constants|pre-declared constant]] <code>[[Go_iota|iota]]</code>: | ||
<syntaxhighlight lang='go'> | |||
type SomeType int | |||
const ( | |||
EnumOne SomeType = iota | |||
EnumTwo | |||
... | |||
) | |||
This article explains how <code>iota</code> is used to generate values for enumeration members: | |||
{{Internal|Go_iota#How_Does_the_Compiler_Assign_Values_to_iota|How Does the Compiler Assign Values to iota}} | |||
Example: | |||
<syntaxhighlight lang='go'> | <syntaxhighlight lang='go'> | ||
type DayOfTheWeek int | type DayOfTheWeek int |
Revision as of 20:05, 13 September 2024
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 (
EnumOne SomeType = iota
EnumTwo
...
)
This article explains how <code>iota</code> is used to generate values for enumeration members:
{{Internal|Go_iota#How_Does_the_Compiler_Assign_Values_to_iota|How Does the Compiler Assign Values to iota}}
Example:
<syntaxhighlight lang='go'>
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)
}