Какое значение аргументов будет в момент срабатывания функции в Defer

«Какое значение аргументов будет в момент срабатывания функции в Defer» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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