recover()?recover() останавливает распространение паники и возвращает значение, переданное в panic(). Важно: работает только внутри defer-функции.
При панике выполнение идёт "назад" по стеку, и по пути вызываются отложенные функции. Только в этом контексте recover() может перехватить значение паники. В обычном коде вызов recover() всегда возвращает nil.
func safeCall(f func()) (err interface{}) {
defer func() {
err = recover()
}()
f()
return nil
}
safeCall(func() { panic("oops") })
// err будет "oops"
recover() возвращает nilpanic(x) - возвращается x (тип any)Тип переданного значения проверяют через type assertion: if s, ok := r.(string); ok { ... }.