P
prepair.app
Пройти интервью →
EnglishУкраїнськаРусскийDeutsch
🦫

Middle Go BackendВопросы на собеседовании Golang

Middle · 2–4 года опыта

Собеседование Go фокусируется на горутинах, каналах, интерфейсах и обработке ошибок — язык маленький, поэтому вопросы идут вглубь, а не вширь. Ниже — самые частые с эталонными ответами. Middle: более глубокое понимание, оптимизацию и реальные рабочие ситуации.

Попробовать — без регистрации
Готовим вопрос…

Темы для подготовки

Горутины и планировщик
Каналы и select
Интерфейсы и композиция
Обработка ошибок
Слайсы и мапы
Контекст и отмена

7 вопросов уровня Middle с ответами

1

Чем буферизованный канал отличается от небуферизованного?

Ответ

Небуферизованный синхронизирует: отправка блокируется, пока получатель не заберёт значение, то есть стороны встречаются. Буферизованный принимает до своей ёмкости без получателя и блокируется только на заполнении. Небуферизованный безопаснее по умолчанию, потому что делает передачу явной; буфер — это решение о том, сколько работы разрешено накопить.

2

Когда горутина утекает и как это заметить?

Ответ

Когда она навсегда блокируется на канале, который никто не прочитает или не запишет, либо ждёт контекст, который не отменят. Замечают по числу горутин, которое растёт и не падает: runtime.NumGoroutine() или профиль горутин в pprof, показывающий, где именно они стоят. Обычная причина — producer, вышедший раньше и оставивший consumer ждать.

3

Зачем нужен `context`?

Ответ

Чтобы нести дедлайн, сигнал отмены и значения уровня запроса через границы API. Настоящая его работа — отмена: когда запрос брошен, всё, что он запустил, должно остановиться, а не продолжать работать впустую. Полезным его удерживает правило: контекст идёт первым параметром и никогда не хранится в структуре.

4

Чем `select` с `default` отличается от `select` без него?

Ответ

Без default он блокируется, пока не будет готов какой-нибудь из случаев. С default он немедленно уходит в него, если больше ничего не готово, и операция становится неблокирующей. default внутри цикла без другого блокирования — это активное ожидание, которое сожжёт ядро.

5

Что находит детектор гонок, а что нет?

Ответ

Находит одновременный доступ к одной памяти, где хотя бы один — запись, на тех путях кода, которые реально выполнились в этом прогоне. Не находит гонку, которую вы не задели: это рантайм-инструмент, а не доказательство. Поэтому ему место в CI на настоящих тестах, а не в разовом запуске руками.

6

Как выбирать между мьютексом и каналом?

Ответ

Мьютекс защищает общее состояние, канал передаёт владение данными. Если несколько горутин читают и пишут одну структуру — мьютекс проще и быстрее. Если работа переходит от одной горутины к другой — канал выражает это напрямую. Тянуться за каналом ради счётчика — частое усложнение на пустом месте.

7

Что гарантирует `sync.WaitGroup` и как его ломают?

Ответ

Что Wait вернётся, когда счётчик дойдёт до нуля, то есть все отслеживаемые горутины завершились. Ломают двумя способами: вызовом Add внутри самой горутины, что гоняется с Wait, и передачей WaitGroup по значению, из-за чего он копируется, а исходный счётчик остаётся нетронутым. Оба компилируются и оба падают через раз.

🦎

Прочитать ответы недостаточно

На собеседовании ты говоришь вслух под давлением. Кем задаст эти же вопросы, оценит каждый ответ и покажет, что именно подтянуть.

Пройти интервью Middle Go Backend →
Бесплатно · 3 интервью в месяц

Другие уровни — Go Backend

Junior Go BackendSenior Go BackendВсе вопросы Go Backend

Другие специализации

🔍Middle QA Manual🤖Middle QA AutomationMiddle Java Backend🐍Middle Python Backend🐘Middle PHP Backend🟢Middle Node.js Backend💎Middle Ruby on Rails🟣Middle .NET Backend Developer🔷Middle C++🟨Middle JavaScript