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

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

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

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

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

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

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

1

В чём разница между буферизованным и небуферизованным каналом?

Ответ

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

2

Как работает select? Что произойдёт, если готовы несколько case?

Ответ

select ждёт нескольких операций с каналами и продолжает с той, что готова. Если готовы сразу несколько, выбор делается равномерно случайно, что не даёт ни одному case голодать. Ветка default превращает конструкцию в неблокирующую, а select вообще без case блокируется навсегда — иногда это используют намеренно, чтобы «припарковать» горутину.

3

Объясните разницу между слайсом и массивом. Как работает append?

Ответ

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

4

Что такое интерфейс в Go? Почему их называют имплицитными?

Ответ

Интерфейс — это набор сигнатур методов; любой тип, у которого эти методы есть, удовлетворяет ему без всякого объявления. Именно это и значит имплицитность — нет ключевого слова implements, поэтому интерфейс можно объявить в потребляющем пакете, и существующие типы ему уже соответствуют. Идиоматичный совет: держать интерфейсы маленькими и объявлять их там, где используют, а не рядом с реализацией.

5

Как обрабатывать ошибки в Go? Что такое error wrapping через %w?

Ответ

Ошибки — обычные значения, возвращаемые рядом с результатом и проверяемые явно в каждом месте вызова. Обёртывание через fmt.Errorf с глаголом %w сохраняет исходную ошибку внутри нового сообщения, поэтому вызывающий код по-прежнему может применить errors.Is для проверки на сентинел или errors.As для извлечения типизированной ошибки. Обёртывание добавляет контекст по мере подъёма ошибки, не лишая её программной проверяемости.

6

Что такое context.Context и зачем он нужен?

Ответ

Context переносит сигнал отмены, дедлайн и значения уровня запроса через границы API. Когда клиент отключился или сработал таймаут, отмена контекста распространяется на все производные горутины, так что запросы к базе и HTTP-вызовы прерываются, а не утекают. По соглашению его передают первым параметром и никогда не хранят в структуре.

7

Что такое defer? В каком порядке выполняются отложенные вызовы?

Ответ

defer планирует вызов на момент выхода из функции, независимо от того, каким путём или через какую панику она завершилась. Отложенные вызовы выполняются в порядке «последним пришёл — первым вышел», то есть последний defer срабатывает первым. Аргументы вычисляются в момент записи defer, а не при выполнении — частый источник сюрпризов, когда откладывают вызов, захватывающий переменную цикла.

8

Как избежать race condition? Mutex или каналы?

Ответ

Гонка данных — это несинхронизированный конкурентный доступ, где хотя бы одна сторона пишет, и она детектируется флагом -race. sync.Mutex берут, когда горутины делят кусок состояния и нужно просто сериализовать доступ к нему. Каналы берут, когда владение данными передаётся между горутинами — правило звучит как «разделяйте память через общение, а не общайтесь через разделяемую память».

🦎

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

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

Пройти интервью 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 React Frontend💚Middle Vue Frontend🅰️Middle Angular FrontendMiddle Next.js