> Что происходит с паниками в Go? (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: InDrive

Стек: Go

> Пример ответа

В Go паника (panic) - это механизм аварийного завершения программы при возникновении невосстановимой ошибки, например, разыменования nil-указателя, выхода за границы слайса или явного вызова panic(). При панике нормальное выполнение функции немедленно прекращается, и начинается раскрутка стека (stack unwinding): последовательно вызываются все отложенные функции (defer) в каждой функции текущей горутины. Если ни один из defer не вызывает recover(), программа завершается с выводом сообщения об ошибке и стектрейса.

Ключевой момент: панику можно перехватить с помощью recover() внутри отложенной функции. Если recover() вызван в defer, он останавливает раскрутку стека и возвращает значение, переданное в panic(). После этого выполнение продолжается с точки, следующей за вызовом defer. Однако recover() работает только в той же горутине, где произошла паника, и только внутри defer. Пример:

GO
func safeCall() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
panic("something went wrong")
}

Важно: паники не должны использоваться для обработки обычных ошибок - для этого есть возврат ошибок (error). Паника - это крайняя мера для truly exceptional ситуаций, например, ошибок инициализации или багов. В production-коде рекомендуется перехватывать паники на верхнем уровне (например, в HTTP-обработчике или воркере), чтобы не уронить весь сервис.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью