В какой момент выполняется функция, зарегистрированная через defer?
defer
Сразу после строки с defer, то есть в момент регистрации, как обычный вызов функции.
Только при достижении конца тела функции, но не при досрочном return и не при panic.
return
panic
При выходе из функции, в которой стоит defer, — как при обычном return, так и при panic.
Только при нормальном return; при panic раскрутка стека пропускает все зарегистрированные defer.
В начале следующей функции в стеке вызовов, после того как текущая функция уже завершилась.