recover() возвращает не nil только внутри отложенной функции и только в той же горутине, где был panic. Вызов recover вне defer бесполезен (всегда nil). В другой горутине panic не перехватывается - каждая горутина обрабатывает свой panic.
recover()