Это не до или после, это все о том, присутствует оператор defer в стеке или нет.если это так (если элемент управления достигает оператора defer, он сохраняет оператор сохраняет в стек), то после того, как он будет выполнен после оператора return.
, например -
func testing() err {
x, err := doSomething();
if err != nil {
return;
}
defer fmt.Println("hello")
return nil
}
Такесли err != nil
эта отсрочка никогда не будет выполнена, потому что программа вернулась до того, как элемент управления достигнет оператора defer.
Теперь перейдем к вашему Вопросу (все дойдут до оператора defer) 1. case, оператор сохранен встек равен defer fmt.Printf("in defer: x = %d\n", x)
(с нулевым значением x)
case - оператор, хранимый в стеке:
Функция defer func() {
fmt.Printf("in defer: x = %d\n", x)
}()
, которая зависит от x (Примечание в стеке откладываетоператор является функцией, и значение функции будет назначено во время выполнения функции)
Кейс -
defer fmt.Printf("in defer: x = %d\n", x)
со значением 7