В корне горутины вызвать defer recover() и обработать: залогировать, отправить ошибку в канал или в errgroup. Иначе непойманная паника завершит программу. Не восстанавливать панику "молча" - хотя бы логировать.
go func() {
defer func() { if r := recover(); r != nil { errCh <- fmt.Errorf("panic: %v", r) } }()
doWork()
}()