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