🔴 Сложный · 3 очк. defer, panic, recover
Можно ли перехватить panic из другой горутины?
A Да, через recover()
B Нет
C Да, через канал
D Да, через WaitGroup
Объяснение вопроса

Нет. У каждой горутины свой стек вызовов. recover() перехватывает панику только в той горутине, где она произошла.

Почему так

Паника раскручивает стек только текущей горутины. Другая горутина не может "залезть" в чужой стек и перехватить панику. Если в горутине паника не перехвачена - процесс завершается (fatal error).

go func() {
    defer func() {
        if r := recover(); r != nil {
            log.Println("recovered in goroutine:", r)
        }
    }()
    panic("in goroutine")
}()

time.Sleep(time.Second)
// Паника перехвачена внутри той же горутины

Что делать при панике в горутине

  • Вызывать recover() в defer внутри той же горутины
  • Сообщать об ошибке в канал или через общую переменную (с синхронизацией)

Неперехваченная паника в любой горутине завершает всю программу.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.