Какое значение будет у переменной на выходе, если присвоить его в defer

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

Ответ

В 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 вычисляются сразу, а замыкания — при выполнении.