Основы и пакеты
Go задумывался как маленький язык, который читается сразу: горстка ключевых слов, один способ объявить переменную про запас и короткий := для локальных, базовые типы фиксированной ширины и инструмент go, который собирает, запускает и тестирует без отдельной системы сборки. Из-за этой простоты основы часто проскакивают мимо — «пакет как пакет, переменная как переменная».
Под простым синтаксисом прячется модель, которую и проверяют на собеседовании: переменная без инициализатора получает не мусор, а строго определённое нулевое значение; := во вложенной области может затенить внешнюю переменную; имя экспортируется ровно тогда, когда начинается с заглавной буквы; iota считает строки, а не значения. Эта тема разбирает старт программы по слоям — от пакетов и объявлений до видимости имён и команд go.
Карта темы
- Пакеты и импорты — программа собирается из пакетов;
package mainиfunc main— точка входа, а импорт подключает другие пакеты по пути. - Объявления:
var,const,:=—varобъявляет переменную (с типом или без),const— неизменяемую константу, а:=— короткое объявление с выводом типа внутри функции. - Базовые типы — целые и вещественные числа фиксированной ширины,
bool,string; преобразование типов в Go всегда явное. - Нулевые значения — переменная без инициализатора получает нулевое значение типа (
0,false,"",nil), полезное по умолчанию. - iota и константы — счётчик
iotaрастёт построчно вconst-блоке (учитывая_) и обнуляется в новом блоке. - Имена и видимость — заглавная первая буква делает имя экспортируемым (видимым из других пакетов), строчная — пакетно-приватным.
- Сборка и запуск —
go run,go build,go modиgofmt: как собрать, запустить и оформить программу.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Считать, что неинициализированная переменная держит мусор, как в C | На самом деле Go всегда обнуляет её до нулевого значения типа |
Думать, что нулевая string — это nil | Это пустая ""; s == nil даже не компилируется |
Писать в nil-map без make | Чтение даёт ноль, а запись паникует assignment to entry in nil map |
Использовать := во вложенном блоке, не замечая затенения внешней переменной | Внешняя переменная не меняется — частый источник «потерянных» присваиваний и ошибок с err |
Ждать, что iota пропустит значение на строке _ | Строка _ потребляет свой iota, сдвигая все последующие константы |
| Называть экспортируемую функцию со строчной буквы | Имя остаётся пакетно-приватным и не виден из других пакетов |
Рассчитывать на неявное преобразование int в float64 | Go требует явного float64(x) — иначе ошибка компиляции |
Значение для собеседований
Основы — это фильтр junior-секции: спрашивают не синтаксис, а модель под ним. Кандидат, который учил «как писать», но не «как это работает», спотыкается ровно здесь.
Что обычно проверяют:
- Чем
var,constи:=отличаются и где каждый применим. - Какое нулевое значение у переменной без инициализатора и почему
nil-map нельзя писать. - Что такое
iotaи как из него собирают перечисления и битовые флаги. - Как Go решает, экспортируемо имя или нет (по регистру первой буквы).
- Что делают
go run,go buildиgo mod.