Что такое iota?go-30

iota — это специальный идентификатор в Go, который используется для создания последовательных числовых констант в блоках const. Это мощный инструмент для объявления перечислений (enums) и последовательных значений.

Основные свойства iota

const (
    Zero = iota  // 0
    One          // 1
    Two          // 2
)
  1. Начинается с 0 в каждом новом блоке const
  2. Автоматически инкрементируется на 1 для каждого последующего элемента
  3. Сбрасывается в каждом новом блоке const

Продвинутое использование

1. Начальное значение не 0

const (
    _ = iota + 5  // пропускаем первое значение
    Five          // 5
    Six           // 6
)

2. Пропуск значений

const (
    A = iota  // 0
    _         // пропуск (1)
    B         // 2
    C         // 3
)

3. Битовая маска

const (
    Read = 1 << iota  // 1 (0b001)
    Write             // 2 (0b010)
    Execute           // 4 (0b100)
)

4. Выражения с iota

const (
    KB = 1 << (10 * iota)  // 1 << (10*0) = 1
    MB                     // 1 << (10*1) = 1024
    GB                     // 1 << (10*2) = 1048576
)

Особенности работы

  1. Сброс значения:

    const (
        X = iota  // 0
        Y         // 1
    )
    
    const (
        Z = iota  // снова 0
    )
    
  2. Не обязательно первое значение:

    const (
        Alpha = 10
        Beta = iota  // 1 (не 0!)
        Gamma        // 2
    )
    
  3. Можно использовать в выражениях:

    const (
        P = iota * 2  // 0
        Q             // 2
        R             // 4
    )
    

Практический пример

package main

import "fmt"

const (
    Sunday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

func main() {
    fmt.Println(Monday, Wednesday, Friday) // Вывод: 1 3 5
}

Резюмируем

  • iota — счетчик для генерации последовательных констант
  • Начинается с 0 в каждом блоке const
  • Автоматически увеличивается на 1
  • Полезен для создания:
    • Перечислений (enums)
    • Битовах масок
    • Последовательностей значений
    • Размеров данных (KB, MB, GB)
  • Может использоваться в выражениях
  • Значение сбрасывается для каждого нового блока const