Вопросы на собеседовании: Go
Реальные вопросы с Go-собеседований: слайсы, горутины, каналы и типичные ловушки новичков.
Курс «Вопросы на собеседовании: Go» состоит из 5 разделов и 14 уроков: Типы и память, Горутины и каналы, Интерфейсы и структуры, Обработка ошибок и Особенности рантайма. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Типы и память
- Передача по значению или по указателю
Разбираем классический вопрос Go-собеседования: когда функция получает копию структуры, а когда — доступ к оригиналу через указатель. Примеры кода и типичные ошибки.
- Как устроен слайс изнутри
Разбираем внутреннее устройство слайса в Go: указатель на массив, len и cap, и почему append иногда создаёт новый массив, а иногда переиспользует старый.
- Массив против слайса
Чем массив фиксированного размера в Go отличается от слайса: почему [5]int и [10]int — разные типы, как это влияет на копирование, и когда массив всё же уместен.
- Передача по значению или по указателю
2 Горутины и каналы
- Горутины: лёгкие потоки Go
Чем горутина отличается от потока ОС, как запустить её через go, и почему захват переменной цикла — классическая ловушка на собеседовании по Go.
- Каналы: как горутины общаются
Буферизованные и небуферизованные каналы в Go: когда отправка и приём блокируются, как закрывать канал и читать его через range.
- select и WaitGroup
Как оператор select ждёт несколько каналов сразу и как sync.WaitGroup позволяет корректно дождаться завершения группы горутин в Go.
- Горутины: лёгкие потоки Go
3 Интерфейсы и структуры
- Интерфейсы и неявная реализация
Разбираем на собеседовании по Go: почему нет слова implements, как компилятор понимает, что тип реализует интерфейс, и главная ловушка с nil-интерфейсом.
- Встраивание структур (composition over inheritance)
Вопросы на собеседовании по Go: как встраивание структур заменяет наследование, что такое продвижение методов и что происходит при совпадении имён методов.
- any (interface{}) и приведение типов
Вопросы на собеседовании по Go: когда использовать any вместо interface{}, безопасное приведение типов через comma-ok и разбор type switch.
- Интерфейсы и неявная реализация
4 Обработка ошибок
- Интерфейс error и его идиомы
Почему в Go нет try/catch: интерфейс error, идиома if err != nil и обёртывание ошибок через fmt.Errorf с глаголом %w — разбор с примерами кода для собеседования.
- panic и recover
Когда в Go действительно нужен panic, а когда это плохая практика, и как recover перехватывает панику внутри defer — с примерами и частыми ошибками на собеседовании.
- defer: порядок выполнения
LIFO-порядок нескольких defer в одной функции и классическая ловушка с defer внутри цикла — разбор с примерами кода, который часто спрашивают на Go-собеседованиях.
- Интерфейс error и его идиомы
5 Особенности рантайма
- Сборка мусора в Go простыми словами
Как работает garbage collector в Go: алгоритм mark-and-sweep, почему GC в Go считается быстрым и что спрашивают на собеседованиях.
- Escape analysis: стек или куча?
Escape analysis в Go: как компилятор решает, где разместить переменную — на стеке или в куче, и почему это влияет на производительность.
- Сборка мусора в Go простыми словами