Поиск…


Вступление

Iota предоставляет способ объявления числовых констант из исходного значения, которое растет монотонно. Iota может использоваться для объявления битовых масок, которые часто используются в системном и сетевом программировании и других списках констант со связанными значениями.

замечания

iota используется для назначения значений спискам констант. Когда йота используется в списке начинается с нулевым значением, и увеличивается на единицу для каждого значения в списке констант и сбрасывается на каждом const ключевого слова. В отличие от перечислений других языков, iota может использоваться в выражениях (например, iota + 1 ), что обеспечивает большую гибкость.

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

Чтобы создать список констант - присвойте значение iota каждому элементу:

const (
  a = iota // a = 0
  b = iota // b = 1
  c = iota // c = 2
)

Чтобы создать список констант в сокращенном виде - присвойте значение iota первому элементу:

const (
  a = iota // a = 0
  b        // b = 1
  c        // c = 2
)

Использование iota в выражении

iota может использоваться в выражениях, поэтому его также можно использовать для назначения значений, отличных от простых инкрементных целых чисел, начиная с нуля. Чтобы создать константы для единиц СИ, используйте этот пример из « Эффективного перехода» :

type ByteSize float64

const (
    _           = iota // ignore first value by assigning to blank identifier
    KB ByteSize = 1 << (10 * iota)
    MB
    GB
    TB
    PB
    EB
    ZB
    YB
)

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

Значение iota все равно увеличивается для каждой записи в постоянном списке, даже если iota не используется:

const ( // iota is reset to 0
    a = 1 << iota  // a == 1
    b = 1 << iota  // b == 2
    c = 3          // c == 3  (iota is not used but still incremented)
    d = 1 << iota  // d == 8
)

он также будет увеличиваться, даже если константа вообще не создается, что означает, что пустой идентификатор можно использовать для полного пропущения значений:

const (
  a = iota // a = 0
  _        // iota is incremented
  b        // b = 2
)

Первый блок кода был взят из Go Spec (CC-BY 3.0).

Использование iota в списке выражений

Поскольку iota увеличивается после каждого ConstSpec , значение в пределах одного списка выражений будет иметь такое же значение для iota :

const (
    bit0, mask0 = 1 << iota, 1<<iota - 1  // bit0 == 1, mask0 == 0
    bit1, mask1                           // bit1 == 2, mask1 == 1
    _, _                                  // skips iota == 2
    bit3, mask3                           // bit3 == 8, mask3 == 7
)

Этот пример был взят из Go Spec (CC-BY 3.0).

Использование iota в битовой маске

Йота может быть очень полезна при создании битовой маски. Например, чтобы представить состояние сетевого соединения, которое может быть безопасным, аутентифицированным и / или готовым, мы могли бы создать битмаску следующим образом:

const (
    Secure = 1 << iota // 0b001
    Authn              // 0b010
    Ready              // 0b100
)

ConnState := Secure|Authn // 0b011: Connection is secure and authenticated, but not yet Ready

Использование iota в const

Это перечисление для создания const. Go компилятор запускает iota от 0 и увеличивается на единицу для каждой следующей константы. Значение определяется во время компиляции, а не времени выполнения. Из-за этого мы не можем применять iota к выражениям, которые оцениваются во время выполнения.

Программа для использования iota в const

package main

import "fmt"

const (
    Low = 5 * iota
    Medium
    High
)

func main() {
    // Use our iota constants.
    fmt.Println(Low)
    fmt.Println(Medium)
    fmt.Println(High)
}

Попробуйте в Go Playground



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow