В Go ключевое слово defer откладывает выполнение функции до момента выхода из окружающей функции. При этом аргументы функции, переданной в defer, вычисляются сразу в момент объявления defer, а не при самом выполнении.
Можем ли мы в функции defer менять переменную, которая стоит на return? Что вернётся: 20 или 10, если favoriteNumber=10 и в defer прибавляем 10?
В Go ключевое слово defer откладывает выполнение функции до момента выхода из окружающей функции. При этом аргументы функции, переданной в defer, вычисляются сразу в момент объявления defer, а не при самом выполнении.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В Go ключевое слово defer откладывает выполнение функции до момента выхода из окружающей функции. При этом аргументы функции, переданной в defer, вычисляются сразу в момент объявления defer, а не при самом выполнении.
Если переменная используется внутри функции, вызванной через defer, то значение переменной будет тем, которое было на момент объявления defer, если оно передано как аргумент. Если же переменная используется напрямую (например, через замыкание), то будет использовано её текущее значение на момент выполнения отложенной функции.
Пример:
func example() {
x := 1
defer fmt.Println(x) // x будет 1, так как аргумент вычислен сразу
x = 2
}
// При вызове example() будет выведено: 1
Если же использовать замыкание:
func example() {
x := 1
defer func() { fmt.Println(x) }() // функция вызовется при выходе, x будет 2
x = 2
}
// При вызове example() будет выведено: 2
Таким образом, результат присвоения переменной в defer зависит от того, как именно переменная используется — как аргумент функции или через замыкание.