Эффективный переход заявляет следующее относительно отсрочки:
Аргументы отложенной функции (включая приемник, если функция является методом) оцениваются при выполнении отсрочки, а не при выполнении вызова. Кроме того, чтобы избежать беспокойства о переменных, изменяющих значения по мере выполнения функции, это означает, что один отложенный сайт может отложить выполнение нескольких функций. Вот глупый пример.
for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) }
Отложенные функции выполняются в порядке LIFO, поэтому этот код вызывает печать
4 3 2 1 0
, когда функция возвращается.
Этот пример меня смущает. Если параметры оцениваются, когда выполняется запрос отсрочки, то отбойщики в цикле for должны печатать 5 5 5 5 5
, так как вызовы будут вызываться, когда цикл for завершается, и в это время i
будет равно 5. Оценка отступников на конец цикла for, таким образом, приведет к 5 для всех вызовов.
Я что-то пропустил?