Ответ
Defer имеет область видимости функции, в которой он объявлен. Он выполняется перед выходом из функции, независимо от того, произошёл ли выход по return, panic или просто достигнут конец функции.
Пример:
func main() {
defer fmt.Println("deferred in main") // выполнится при выходе из main
if true {
defer fmt.Println("deferred in if") // выполнится перед выходом из main
}
fmt.Println("main end")
}
// Вывод:
// main end
// deferred in if
// deferred in main
Важно:
- Порядок выполнения defer — LIFO (последний добавленный — первый выполнится).
- Defer "запоминает" значения переменных на момент объявления, а не выполнения.