Что произойдет с аргументами функции, переданными в defer, при ее выполнении?

В Go при использовании defer аргументы функции, переданной в defer, вычисляются сразу в момент объявления defer, а сама функция вызывается позже, когда окружающая функция завершает выполнение.

Короткий ответ

Что ответить на собеседовании

В Go при использовании defer аргументы функции, переданной в defer, вычисляются сразу в момент объявления defer, а сама функция вызывается позже, когда окружающая функция завершает выполнение.

Подробный разбор

Ответ с пояснениями

Условие

Что произойдет с аргументами функции, переданными в defer, при ее выполнении?

Ответ

В Go при использовании defer аргументы функции, переданной в defer, вычисляются сразу в момент объявления defer, а сама функция вызывается позже, когда окружающая функция завершает выполнение.

Это значит, что если аргументы изменяются после defer, то в отложенном вызове будет использовано именно то значение, которое было на момент defer.

Пример:

func example() {
    x := 10
    defer fmt.Println(x) // аргумент x фиксируется как 10
    x = 20
}
// При выходе из example будет выведено 10, а не 20

Таким образом, defer сохраняет копии аргументов при объявлении.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее