Перейти к основному содержимому

Roadmap:

1. Базовые типы и конструкции (Основы)

Здесь редко валят, но нужно уверенно отвечать на базовые вещи.

  • Типы данных: Какие бывают, их размер в памяти, значения по умолчанию (zero-values).
  • Строки (Strings): Что такое строка в Go (указатель и длина). Разница между byte и rune. Как работает UTF-8 под капотом. Неизменяемость (immutability) строк. Конкатенация и strings.Builder.
  • Управляющие конструкции: Особенности for, switch (fallthrough), if, defer, panic, recover.
  • Функции: Именованные возвращаемые значения, замыкания (closures) и связанные с ними ловушки (например, захват переменной цикла).

2. Встроенные структуры данных

Мы с тобой уже начали это разбирать, и ты молодец, что сразу копаешь глубоко!

  • Массивы vs Слайсы: Отличия. Устройство слайса (указатель, len, cap).
  • Алгоритм роста слайса: Амортизированная сложность append, утечки памяти при создании под-слайсов (reslicing).
  • Map (Хеш-таблицы): Внутреннее устройство (hmap, бакеты, эвакуация данных, коллизии).
  • Потокобезопасность: Почему map не потокобезопасна и как это решать (sync.RWMutex, sync.Map).

3. Указатели, Структуры и ООП в Go

В Go нет классического ООП, поэтому спрашивают, как его имитировать.

  • Указатели: Разница между передачей по значению и по указателю. Когда использовать одно, а когда другое.
  • Структуры (struct): Выравнивание памяти в структурах (Memory Alignment / Padding) — частый вопрос на Middle-позиции для оптимизации памяти.
  • Методы: Value receivers vs Pointer receivers.
  • Композиция: Встраивание (embedding) структур вместо наследования.

4. Интерфейсы (Основа архитектуры Go)

Это топ-2 по популярности тема после многопоточности.

  • Что такое интерфейс: Duck typing ("Утиная типизация"). Внутреннее устройство интерфейса (две ссылки: itab и data).
  • Пустой интерфейс (interface{} / any): Что это такое и когда применять. Type assertion и Type switch.
  • Ловушка с nil: Почему интерфейс, которому присвоен nil-указатель, не равен nil (очень частый вопрос с подвохом).

5. Многопоточность (Concurrency) — Сердце Go

Здесь задают больше всего вопросов и дают практические задачи на написание кода.

  • Горутины: Чем горутина отличается от потока ОС. Планировщик Go (GMP-модель: Goroutine, Machine, Processor).
  • Каналы (Channels): Буферизированные и небуферизированные. Чтение/запись в закрытый канал, запись в nil канал. Блокировки.
  • Конструкция select: Как работает, default кейс, таймауты.
  • Примитивы синхронизации (пакет sync): Mutex, RWMutex, WaitGroup, atomic, Once, Pool. Что выбрать: каналы или мьютексы?
  • Состояния гонки (Data Race): Что это такое и как искать (-race флаг). Дедлоки (Deadlocks).

6. Управление памятью (Under the hood)

  • Стек и Куча (Stack vs Heap): Что где выделяется.
  • Escape Analysis (Анализ побега): Как компилятор Go решает, куда положить переменную.
  • Garbage Collector (GC): Как работает (алгоритм Mark and Sweep / Tricolor), фазы работы сборщика, что такое STW (Stop The World) и GC Pressure.

7. Экосистема и стандартные пакеты

  • Ошибки (Errors): Интерфейс error. Оборачивание ошибок (wrapping). Функции errors.Is и errors.As.
  • Пакет context: Зачем нужен, как работает дерево контекстов (WithCancel, WithTimeout, WithValue). Обязательно спросят, как корректно завершать горутины по таймауту.
  • Тестирование: Пакет testing. Table-driven tests. Бенчмарки. Mock-и.

8. Архитектура и Best Practices (Для уровня уверенного Junior/Middle)

  • Dependency Injection (DI): Как передавать зависимости.
  • Чистая архитектура (Clean Architecture): Слои (Хендлеры, Бизнес-логика, Репозитории).
  • Go Modules: Как работает go.mod и go.sum.