recover()?recover() имеет эффект только внутри отложенной (deferred) функции. Вызов в обычном коде всегда возвращает nil.
defer func() {
if r := recover(); r != nil {
log.Printf("panic recovered: %v", r)
}
}()
doRiskyWork()
Анонимная функция вызывается при выходе из окружающей функции (нормальном или из-за паники). Внутри неё recover() возвращает значение паники или nil.
defer recover() // бесполезно: recover() вызывается "сейчас", не в defer-контексте
defer fmt.Println(recover()) // тоже не то: аргумент вычисляется при регистрации defer
Нужна именно defer func() { ... recover() ... }() - вызов recover() должен произойти при выполнении отложенной функции.