Поиск…
Вступление
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