Что произойдёт при panic в горутине Go?

Контекст: обработка исключений в Go, concurrency panic аварийно прекращает выполнение текущей горутины если panic не перехвачен через recover, горутина завершится с ошибкой остальная программа продолжит выполняться,…

Короткий ответ

Что ответить на собеседовании

Контекст: обработка исключений в Go, concurrency panic аварийно прекращает выполнение текущей горутины если panic не перехвачен через recover, горутина завершится с ошибкой остальная программа продолжит выполняться, если это не main-горутина panic в main-горутины завершает работу всего приложения recover даёт возможность перехватить и обработать panic внутри defer ф-ции корректная обработка panic предотвращает крах сервера/приложения

Подробный разбор

Ответ с пояснениями

Что произойдёт при panic в горутине Go?

  • Контекст: обработка исключений в Go, concurrency
  • panic аварийно прекращает выполнение текущей горутины
  • если panic не перехвачен через recover, горутина завершится с ошибкой
  • остальная программа продолжит выполняться, если это не main-горутина
  • panic в main-горутины завершает работу всего приложения
  • recover даёт возможность перехватить и обработать panic внутри defer ф-ции
  • корректная обработка panic предотвращает крах сервера/приложения

Детально: В Go panic предназначен для аварийных ситуаций и прерывает выполнение горутины. В отличие от исключений в других языках, без recover он завершает именно текущую горутину. Благодаря этому ошибку можно изолировать и не допустить неожиданного падения всей программы. Использовать recover следует осторожно, чтобы не замаскировать настоящие ошибки.

Подробный ответ

Основной ответ

Когда в горутине Go возникает panic, её выполнение сразу прекращается, после чего запускается "разворачивание стека" (stack unwinding): все отложенные вызовы defer выполняются в обратной последовательности. При этом panic одной горутины не завершает аварийно всю программу, если ошибка возникла не в главной горутине (main). Если не обработать panic с помощью recover, горутина завершится с ошибкой, а runtime напечатает стек трейс panic.

Ключевые моменты

  • Изоляция panic: panic напрямую не передаётся другим горутинам. С точки зрения ошибок каждая горутина фактически изолирована.
  • Механизм defer и recover: если вызвать recover() в функции, отложенной посредством defer, panic можно перехватить, не допустить падения горутины и продолжить выполнение.
  • Главная горутина: необработанный panic в главной горутине приводит к аварийному завершению программы.
  • Начиная с Go 1.14+ стек автоматически предварительно сохраняется, благодаря чему отлаживать panic стало удобнее.

Практический контекст

В реальных сервисах горутины обычно запускают через обёртку, применяющую defer + recover для перехвата panic. Это предотвращает неконтролируемый краш всего приложения и особенно важно для серверов и долгоживущих воркеров, которые не должны завершаться из-за неожиданных ошибок в дочерних горутинах.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку