Реализация перечислений в 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.

Ответить