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.