Можно ли отлавливать панику дочерней горутины в родительской горутине

«Можно ли отлавливать панику дочерней горутины в родительской горутине» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно, но не напрямую. Паника в дочерней горутине не распространяется автоматически в родительскую. Однако есть несколько способов:

  1. Использование defer/recover в дочерней горутине:
go func() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in child goroutine:", r)
        }
    }()
    panic("something bad happened")
}()
  1. Через канал для передачи ошибок:
errCh := make(chan error)
go func() {
    defer func() {
        if r := recover(); r != nil {
            errCh <- fmt.Errorf("panic occurred: %v", r)
        }
    }()
    // работа горутины
    errCh <- nil
}()
if err := <-errCh; err != nil {
    // обработка ошибки
}

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