Переменные и типы
Тема дорожной карты · Golang
Переменные и типы в Go формируют основу статической системы типов языка, обнаруживающей ошибки типов во время компиляции, а не во время выполнения, что позволяет создавать надёжные и поддерживаемые Golang-программы. Переменные объявляются с помощью var name Type для пакетного уровня или явных объявлений, либо с помощью оператора короткого объявления := для локальных переменных с выводом типа (count := 0, name := "alice"); вывод типов в Go консервативен — компилятор никогда молча не преобразует числовые типы, поэтому int и int64 различны и требуют явного преобразования. Встроенные типы Go включают целые числа (int, int8, int16, int32, int64, uint*), числа с плавающей точкой (float32, float64), комплексные числа, bool, string, byte (псевдоним uint8) и rune (псевдоним int32 для кодовых точек Unicode). Константы объявляются через const и могут быть нетипизированными, что позволяет использовать их в выражениях с любым совместимым числовым типом — гибкость, лежащая в основе паттернов перечислений на основе iota. Понимание нулевых значений — 0 для числовых типов, false для bool, "" для string и nil для указателей, слайсов, словарей, каналов и интерфейсов — необходимо, поскольку Go гарантирует инициализацию всех объявленных переменных, устраняя ошибки неопределённого поведения, характерные для C.
Как это работает
Переменные и типы намеренно мал: ключевые слова (var, const, if, for, switch, defer, go, select, return, type, func, package, import), нет классов (struct + методы + интерфейсы), нет исключений (multi-return + error-значения), нет наследования (композиция через embedding). Видимость по регистру: с заглавной — экспорт, со строчной — package-private. := объявляет + присваивает; = — присваивает. defer выполняется при возврате функции — идеально для cleanup. Компилятор не пропустит неиспользуемые импорты + переменные.
Когда применять
Примите минимализм — Go дерётся с попытками умничать. gofmt (без флагов, канонический стиль); коммитьте только отформатированный код. defer — для cleanup в паре с захватом (defer f.Close() сразу после f, err := os.Open(...)). Короткое объявление (:=) внутри функций; var — для zero-valued объявлений или когда нужен конкретный тип.
Типичные ошибки
Ловушки Переменные и типы: for i := range slice и получение и индекса и копии, когда хотели оба (for i, v := range slice); shadow внешних переменных через := ("почему внешняя переменная не изменилась?"); не обрабатывают ошибку немедленно (_, _ = ... игнорирует); глобальное состояние — Go-программы становятся сложными для понимания при shared mutable state.