Ответ
В Go defer откладывает выполнение функции до момента возврата из текущей функции, но аргументы вычисляются немедленно в момент вызова defer.
func main() {
x := 10
defer fmt.Println(x) // x будет 10, так как значение фиксируется здесь
x = 20
}
// Выведет: 10
Если нужно "захватить" текущее значение переменной на момент выполнения defer, можно использовать замыкание:
func main() {
x := 10
defer func() { fmt.Println(x) }() // x будет 20, так как берется в момент выполнения
x = 20
}
// Выведет: 20
Ключевое правило: аргументы defer вычисляются сразу, а замыкания — при выполнении.