← Все этапы
03 · ДАННЫЕ И ТИПЫУрок 18 из 3320 минут

iota и группы констант

Задаём последовательные именованные значения и превращаем их в понятные режимы.

Константы с последовательными значениями

Константа — имя неизменяемого значения. Связанные константы удобно объявлять общей группой. Внутри такой группы iota начинается с нуля и увеличивается на единицу для каждой строки спецификации константы.

Если строку нужно пропустить, используют пустой идентификатор _. Выражение рядом с iota задаёт формулу для текущего шага: например, 1 << iota создаёт степени двойки. Собственный целочисленный тип помогает не смешивать режимы со случайными числами.

Пример

package main

import "fmt"

type access uint8

const (
	guest access = iota
	member
	_ // значение зарезервировано для будущего уровня
	manager
)

func (level access) label() string {
	switch level {
	case guest:
		return "гость"
	case member:
		return "участник"
	case manager:
		return "менеджер"
	default:
		return "неизвестный уровень"
	}
}

func main() {
	fmt.Printf("гость=%d, участник=%d, менеджер=%d\n", guest, member, manager)
	fmt.Println(manager.label())
}

В строках группы guest получает 0, member — 1, пропущенное значение соответствует 2, поэтому manager получает 3. Метод label превращает числовое значение в подпись для человека. Значения за пределами объявленного набора тоже возможны, поэтому предусмотрена ветка default.

Сдвиг битов полезен для независимых флагов, которые можно объединять побитовой операцией. Для обычных состояний, где одновременно выбран ровно один вариант, последовательные значения и явные имена обычно проще читать.

Практика

Попробуйте сами

Объяви тип deliveryState и группу констант: created, packed, пропущенное значение, sent. Добавь метод label() string, возвращающий для этих трёх состояний подписи «создан», «упакован», «отправлен», а для любого другого значения — «неизвестно». В main выведи числовое значение sent и его подпись.

Проверка результата

Как понять, что получилось

sent имеет значение 3. Метод возвращает «отправлен» для sent, правильные подписи для двух предыдущих значений и «неизвестно» для, например, deliveryState(99).

iota и группы констант | Go | WebSchool · Go