Ответ
В defer аргументы функции вычисляются в момент вызова defer, а не в момент выполнения отложенного вызова. Сама функция выполняется перед возвратом из текущей функции.
func main() {
i := 0
defer fmt.Println("Defer:", i) // i = 0
i++
fmt.Println("Main:", i) // i = 1
}
Вывод:
Main: 1
Defer: 0
Здесь i в defer фиксируется как 0, хотя к моменту выполнения defer значение уже 1. Для передачи текущего значения можно использовать анонимную функцию:
defer func() { fmt.Println("Defer:", i) }() // i = 1