Константы с последовательными значениями
Константа — имя неизменяемого значения. Связанные константы удобно объявлять общей группой. Внутри такой группы 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.
Сдвиг битов полезен для независимых флагов, которые можно объединять побитовой операцией. Для обычных состояний, где одновременно выбран ровно один вариант, последовательные значения и явные имена обычно проще читать.