Реализация перечислений в Golang
В этой статье я покажу вам, как реализовать перечисления в Golang, используя предварительно идентифицированную iota
. Прежде чем перейти к перечислениям, давайте разберёмся, что такое iota
и как она используется.
Что такое iota?
iota
– это идентификатор, который используется вместе с constant
и который может упростить определения констант, в которых используются числа с автоматическим приращением. Ключевое слово iota
представляет целочисленную константу, начинающуюся с нуля.
Ключевое слово iota представляет последовательные целочисленные константы 0, 1, 2, и т. д. Оно сбрасывается до 0 всякий раз, когда в исходном коде появляется слово const, и увеличивается после каждой спецификации const.
package main
import "fmt"
const (
c0 = iota
c1 = iota
c2 = iota
)
func main() {
fmt.Println(c0, c1, c2) //Print : 0 1 2
}
Вы можете не писать iota
перед каждой константой. Тогда ваш код будет выглядеть так:
package main
import "fmt"
const (
c0 = iota
c1
c2
)
func main() {
fmt.Println(c0, c1, c2) //Print : 0 1 2
}
Чтобы начать список констант с 1 вместо 0, вы можете использовать iota
в арифметическом выражении.
package main
import "fmt"
const (
c0 = iota + 1
c1
c2
)
func main() {
fmt.Println(c0, c1, c2) // Print : 1 2 3
}
Вы можете использовать пустой идентификатор, чтобы пропустить значение в списке констант.
package main
import "fmt"
const (
c1 = iota + 1
_
c3
c4
)
func main() {
fmt.Println(c1, c3, c4) // Print : 1 3 4
}
Реализуем перечисления с помощью iota
Чтобы реализовать пользовательский тип перечисления, мы должны сделать следующее:
- Объявить целочисленный тип.
- Объявить связанные константы, используя
iota
. - Дать типу строковую функцию.
- Дать типу функцию
EnumIndex
.
Пример 1. Создаём перечисление для дней недели.
package main
import "fmt"
type Weekday int
const (
Sunday Weekday = iota + 1 // EnumIndex = 1
Monday // EnumIndex = 2
Tuesday // EnumIndex = 3
Wednesday // EnumIndex = 4
Thursday // EnumIndex = 5
Friday // EnumIndex = 6
Saturday // EnumIndex = 7
)
func (w Weekday) String() string {
return [...]string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}[w-1]
}
func (w Weekday) EnumIndex() int {
return int(w)
}
func main() {
var weekday = Sunday
fmt.Println(weekday) // Print : Sunday
fmt.Println(weekday.String()) // Print : Sunday
fmt.Println(weekday.EnumIndex()) // Print : 1
}
Пример 2. Создаём перечисление для направлений.
package main
import "fmt"
type Direction int
const (
North Direction = iota + 1 // EnumIndex = 1
East // EnumIndex = 2
South // EnumIndex = 3
West // EnumIndex = 4
)
func (d Direction) String() string {
return [...]string{"North", "East", "South", "West"}[d-1]
}
func (d Direction) EnumIndex() int {
return int(d)
}
func main() {
var d Direction = West
fmt.Println(d) // Print : West
fmt.Println(d.String()) // Print : West
fmt.Println(d.EnumIndex()) // Print : 4
}
Заключение
Перечисление – это тип данных, состоящий из набора именованных постоянных значений. Перечисления – это мощная функция с широким спектром применений. Однако в Golang они реализованы иначе, чем в большинстве других языков программирования. Golang не поддерживает перечисления напрямую. Мы можем реализовать это с помощью iota
и constants
.