Основы языка Go
Этот раздел формирует модель языка, с которой удобно читать чужой код и отвечать на вопросы интервью: от области имён и представления значений до публичных контрактов пакета. Сначала пройдите страницы по порядку, затем возвращайтесь к связанным темам при разборе кода.
Результат раздела
После изучения вы умеете предсказывать копирование и aliasing, выбирать value или pointer API, проектировать небольшой пакет, безопасно работать с map и строками, объяснять interface satisfaction и не подменять обработку ошибок panic.
Карта тем
- Пакеты, видимость и именование — модуль, import path, экспорт,
internalи публичная поверхность. - Значения, типы, константы и iota — zero values, определённые типы, alias, conversions и перечисления.
- Массивы, срезы, map и строки — backing array, capacity, aliasing, UTF-8 и конкурентный доступ.
- Структуры, embedding и теги — композиция, promotion, DTO и метаданные библиотек.
- Функции, указатели и семантика значений — copy semantics, receivers, замыкания и ownership.
- Методы и receivers — method sets, value/pointer receivers и последовательный API.
- Интерфейсы, nil и type assertions — неявная реализация, typed nil и безопасная динамическая типизация.
- Generics и параметры типов — constraints, type sets, inference и границы обобщений.
- defer, panic и recover — освобождение ресурсов, аварийные пути и границы recovery.
- Ошибки и error contracts — wrapping, sentinel/typed errors,
errors.Isиerrors.As.
Рекомендуемый порядок
- Страницы 1–5 дают модель областей имён, значений и памяти.
- Страницы 6–7 соединяют модель с method sets, интерфейсными границами и безопасной динамической типизацией.
- Страницы 8–10 закрепляют выбор обобщений, безопасное освобождение ресурсов и error contracts. Модули и tooling изучайте в разделе инструментов.
Не переходите к конкурентности, пока не можете без запуска объяснить различие []T, *[]T, map[K]V, T и *T: эти представления определяют ownership и риск data race.
Проверка готовности
- Я могу назвать import path, package name и экспортируемость любого символа в небольшом примере.
- Я объясняю, какие данные разделяют два среза после присваивания и когда
appendразрывает связь. - Я выбираю pointer receiver по семантике идентичности или мутации, а не по привычке.
- Я умею написать небольшой пакет с документированным API, тестом внешнего потребителя и явной обработкой ошибок.
- Я могу пройти
go test ./...,go vet ./...иgo test -race ./...для учебного модуля и объяснить назначение каждой команды.
Связанные темы
Go: язык, runtime и стандартная библиотека · Конкурентность Go · Runtime и память Go · Стандартная библиотека Go