Основы языка Go

Этот раздел формирует модель языка, с которой удобно читать чужой код и отвечать на вопросы интервью: от области имён и представления значений до публичных контрактов пакета. Сначала пройдите страницы по порядку, затем возвращайтесь к связанным темам при разборе кода.

Результат раздела

После изучения вы умеете предсказывать копирование и aliasing, выбирать value или pointer API, проектировать небольшой пакет, безопасно работать с map и строками, объяснять interface satisfaction и не подменять обработку ошибок panic.

Карта тем

  1. Пакеты, видимость и именование — модуль, import path, экспорт, internal и публичная поверхность.
  2. Значения, типы, константы и iota — zero values, определённые типы, alias, conversions и перечисления.
  3. Массивы, срезы, map и строки — backing array, capacity, aliasing, UTF-8 и конкурентный доступ.
  4. Структуры, embedding и теги — композиция, promotion, DTO и метаданные библиотек.
  5. Функции, указатели и семантика значений — copy semantics, receivers, замыкания и ownership.
  6. Методы и receivers — method sets, value/pointer receivers и последовательный API.
  7. Интерфейсы, nil и type assertions — неявная реализация, typed nil и безопасная динамическая типизация.
  8. Generics и параметры типов — constraints, type sets, inference и границы обобщений.
  9. defer, panic и recover — освобождение ресурсов, аварийные пути и границы recovery.
  10. Ошибки и error contracts — wrapping, sentinel/typed errors, errors.Is и errors.As.

Рекомендуемый порядок

  1. Страницы 1–5 дают модель областей имён, значений и памяти.
  2. Страницы 6–7 соединяют модель с method sets, интерфейсными границами и безопасной динамической типизацией.
  3. Страницы 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

Источники