Что такое константы и можно ли их изменять?go-29
Что такое константы в Go?
Константы в Go — это именованные значения, которые не могут изменяться после их объявления. Они определяются на этапе компиляции и обладают следующими характеристиками:
const Pi = 3.14159
const MaxUsers = 1000
const Prefix = "GO_"
Ключевые особенности констант:
- Объявляются с помощью ключевого слова
const
- Должны быть инициализированы при объявлении
- Могут быть любого базового типа (bool, string, числовые типы)
- Вычисляются во время компиляции
- Существуют только в исходном коде (не имеют адреса в памяти)
Можно ли изменить константу?
Нет, константы нельзя изменить после объявления. Попытка изменения приведет к ошибке компиляции:
const Version = "1.0"
Version = "2.0" // Ошибка: cannot assign to Version
Почему константы неизменяемы?
- Гарантия безопасности: предотвращает случайные изменения
- Оптимизация: компилятор может выполнять подстановку значений
- Читаемость: явно показывает намерение использовать фиксированное значение
Типизированные vs нетипизированные константы
Go поддерживает два вида констант:
- Нетипизированные (untyped):
const Delay = 100 // тип выводится при использовании
- Типизированные (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
и инициализируются при объявлении
- Абсолютно неизменяемы после объявления
- Могут быть типизированными и нетипизированными
- Поддерживают выражения на этапе компиляции
- Не имеют адреса в памяти
- Обеспечивают безопасность и оптимизацию кода