Константы

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

Для определения констант применяется ключевое слово const:

const pi float64 = 3.1415

Невозможно менять значение константы:

package main

import "fmt"

func main() {
    const pi float64 = 3.1415
    pi = 2.7182

    fmt.Println(pi) // Ошибка (cannot assign to pi (constant 3.1415 of type float64))
}

Константы можно объявлять в блоке:

func main() {
    const (
        a int = 1
        e float32 = 2.7
        pi float64 = 3.1415
    )
}

Или так:

const pi, e = 3.1415, 2.7

Если у константы не указан тип, то он выводится неявно на основании того значения, которым инициализируется константа:

const b = 2             // тип int
const pi, e = 3.1415    // тип float64

Обязательно необходимо инициализировать константу начальным значением при ее объявлении. Например, следующие определения констант являются недопустимыми, так как они не инициализируются:

package main
import "fmt"

func main() {
    const d int

    fmt.Println(d)     // Ошибка (missing init expr for d)
}

Если определяется последовательность констант, то инициализацию значением можно опустить для всех констант, кроме первой. В этом случае константа без значения получит значение предыдущей константы:

package main
import "fmt"

func main() {
    const (
        a = 2
        b
        c
        d = 4
        e
    )
    fmt.Println(a, b, c, d, e)      // 2, 2, 2, 4, 4
}

Константы можно инициализировать только константными значениями. Например, литералами типа чисел или строк, или значениями других констант. Однако инициализировать константу значением какой-либо переменной нельзя:

var a int = 5
const b = a         // Ошибка, т.к. m - переменная
const c = 5
const d = c         // Ошибка нет, т.к. с - константа

iota

Ключевое слово iota представляет последовательные целочисленные константы 0, 1, 2,…

Это предопределенный идентификатор в языке Go, который в обычном контексте содержит в себе значение 0. Однако в блоках const этот идентификатор увеличивается для каждой следующей константы на единицу. Это позволяет более удобно создавать константы, значения которых предлставляют непрерывную последовательность чисел. Для сравнение можно привести куски кода без iota и с iota:

package main

import "fmt"

func main() {
    const (
        Zero = 0
        One = 1
        Two = 2
        Three = 3
        Four = 4
        Five = 5
    )

    fmt.Println(Zero)    // вывод 0
    fmt.Println(Five)    // вывод 5
}

Этот же пример, но с использование iota:

package main

import "fmt"

func main() {
    const (
        Zero = iota
        One
        Two
        Three
        Four
        Five
    )

    fmt.Println(Zero)    // вывод 0
    fmt.Println(Five)    // вывод 5
}

Однако, можно начать не с 0, а с 1, тогда код будет выглядеть следующим образом:

package main
import "fmt"

func main() {
    const = (
        a1 = iota + 1
        a2
        a3
    )
    fmt.Println(a1, a2, a3) // 1 2 3
}

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

package main
import "fmt"

func main() {
    const = (
        a1 = iota + 1
        -
        a3
        a4
    )
    fmt.Println(a1, a3, a4) // 1 3 4
}