panic("oops")?recover() возвращает значение типа any, переданное в panic(). При panic("oops") вернётся строка "oops".
defer func() {
r := recover()
fmt.Printf("%T %v
", r, r)
}()
panic("oops")
// string oops
panic(42)
// int 42
Поскольку возвращается any, нужна проверка типа:
if r := recover(); r != nil {
if err, ok := r.(error); ok {
log.Printf("error: %v", err)
} else {
log.Printf("panic: %v", r)
}
}
Если паники не было, recover() возвращает nil. Вызов вне defer тоже даёт nil.