Что такое константы и можно ли их изменять?go-29

Что такое константы в Go?

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

const Pi = 3.14159
const MaxUsers = 1000
const Prefix = "GO_"

Ключевые особенности констант:

  1. Объявляются с помощью ключевого слова const
  2. Должны быть инициализированы при объявлении
  3. Могут быть любого базового типа (bool, string, числовые типы)
  4. Вычисляются во время компиляции
  5. Существуют только в исходном коде (не имеют адреса в памяти)

Можно ли изменить константу?

Нет, константы нельзя изменить после объявления. Попытка изменения приведет к ошибке компиляции:

const Version = "1.0"
Version = "2.0" // Ошибка: cannot assign to Version

Почему константы неизменяемы?

  1. Гарантия безопасности: предотвращает случайные изменения
  2. Оптимизация: компилятор может выполнять подстановку значений
  3. Читаемость: явно показывает намерение использовать фиксированное значение

Типизированные vs нетипизированные константы

Go поддерживает два вида констант:

  1. Нетипизированные (untyped):
const Delay = 100 // тип выводится при использовании
  1. Типизированные (typed):
const Timeout time.Duration = 30 * time.Second

Особенность нетипизированных констант:

  • Могут использоваться в различных контекстах без явного приведения типов
  • Имеют "вид" (kind), но не конкретный тип

Константные выражения

Константы могут быть определены через выражения:

const (
    KB = 1024
    MB = KB * 1024
    GB = MB * 1024
)

Ограничения:

  • Выражения должны вычисляться на этапе компиляции
  • Нельзя использовать вызовы функций (кроме некоторых встроенных: len, cap и др.)
  • Нельзя использовать значения, определяемые в runtime

Проверка неизменяемости

Попытка получить указатель на константу приведет к ошибке:

const Port = 8080
ptr := &Port // Ошибка: cannot take the address of Port

Резюмируем

  • Константы — именованные неизменяемые значения
  • Объявляются через const и инициализируются при объявлении
  • Абсолютно неизменяемы после объявления
  • Могут быть типизированными и нетипизированными
  • Поддерживают выражения на этапе компиляции
  • Не имеют адреса в памяти
  • Обеспечивают безопасность и оптимизацию кода