Перейти к основному содержимому
Модуль 1 · Урок 3 из 53/50 в курсе~10 min
Уроки модуля (3/5)

Константы и йота

Константы — это неизменяемые значения, известные во время компиляции. В Го они есть объявлен с помощью const и может быть типизированным или нетипизированным. Нетипизированные имеют суперсила: они адаптируются к типу, требуемому контекстом, щадя вас от необходимости писать явные преобразования.

Основной синтаксис

Go
const PI = 3.14
const MaxRetry int = 5
const Name = "eLearner"

Тип MaxRetry (int): его можно назначить только int. PI и Name нетипизированы: они ведут себя как «литералы» и адаптируются к контекст.

Go
const PI = 3.14

var f float32 = PI  // ok: PI è non tipata, diventa float32
var d float64 = PI  // ok

const блоков

В блок можно сгруппировать несколько констант:

Go
const (
    StateInitial = "INIT"
    StateReady   = "READY"
    StateError   = "ERROR"
)

iota: счетчик перечисления

Внутри блока const специальный идентификатор iota начинается с 0. и увеличивается на 1 в каждой строке. Это идиома для перечислений:

Go
const (
    Monday = iota // 0
    Tuesday       // 1
    Wednesday     // 2
    Thursday      // 3
    Friday        // 4
)

Последующие строки наследуют выражение, если они его не предоставляют. Поэтому достаточно написать Tuesday, не повторяя = iota.

Шаблоны с выражениями

iota может появляться внутри произвольных выражений:

Go
const (
    KB = 1 << (10 * (iota + 1)) // 1 << 10 = 1024
    MB                          // 1 << 20
    GB                          // 1 << 30
    TB                          // 1 << 40
)

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

Если вы не хотите присваивать значение строке (поскольку вы хотите, чтобы iota в любом случае увеличить), используйте пустой идентификатор _:

Go
const (
    _  = iota // scarta 0
    KB        // 1
    MB        // 2
)

Ваша очередь

Упражнение#go.m1.l3.e1
Попыток: 0Загрузка…

Объявите константу PI со значением 3,14 на уровне пакета, а затем распечатайте ее внутри main.

Загрузка редактора…
Показать подсказку

`const PI = 3.14` идет на уровне пакета, вне основного.

Решение доступно после 3 попыток

Упражнение#go.m1.l3.e2
Попыток: 0Загрузка…

Определите константный блок с днями недели (понедельник, вторник, среда), пронумерованными с 1, используя йоту.

Загрузка редактора…
Показать подсказку

Используйте `iota + 1` в первой строке блока; последующие строки наследуют выражение.

Решение доступно после 3 попыток

Quiz#go.m1.l3.e3
Готово

Что печатает эта программа?

Go
const (
    A = iota * 2
    B
    C
)
fmt.Println(A, B, C)
Варианты ответа

Резюме

  • const для неизменяемых значений, известных во время компиляции.
  • Нетипизированные константы адаптируются к контексту: преобразование не требуется.
  • const ( ... ) блокирует значения, связанные с группой.
  • iota начинается с 0 в каждом блоке и увеличивается построчно.
  • Шаблоны: перечисление (= iota), битовая маска (= 1 << iota), единицы измерения (= 1 << (10*iota)).