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

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

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

Junior · без опыта / до 1 годаMiddle · 2–4 года опытаSenior · 5+ лет опыта

Что спрашивают

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

10 реальных вопросов с ответами

К каждому вопросу — эталонный ответ, с которым можно сравнить свой.

1

Что такое горутина и чем она отличается от потока ОС?

Ответ

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

2

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

Ответ

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

3

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

Ответ

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

4

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

Ответ

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

5

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

Ответ

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

6

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

Ответ

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

7

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

Ответ

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

8

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

Ответ

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

9

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

Ответ

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

10

Что такое nil-интерфейс и почему сравнение с nil может удивить?

Ответ

Значение интерфейса состоит из двух слов: типа и значения. Оно равно nil только когда оба слова nil. Если присвоить интерфейсу nil-указатель конкретного типа, слово типа заполняется, и интерфейс оказывается не-nil, хотя сам указатель nil. Это классический баг, когда функция возвращает nil *MyError как error, и проверка err != nil у вызывающего неожиданно проходит.

🦎

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

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

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

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

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP Backend🟢Node.js Backend⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing