@lamar
В приведённом вами коде выгрузка откладываемых вызовов происходит, как ожидается, но результат может не совпадать с вашими предположениями из-за того, как работает defer
в сочетании с циклами.
При использовании defer
, функции или инструкции откладываются до тех пор, пока текущая функция не завершится. В вашем случае это функции main
. Однако есть одна особенность: defer
фиксирует аргументы функции на момент, когда defer
вызывается. Это означает, что для всех вызовов defer
будет зафиксировано одно и то же значение переменной i
на последней итерации цикла.
В вашем цикле for i := 0; i < 3; i++
при каждой итерации вызывается defer fmt.Println("Index:", i)
. Однако значение i
на момент завершения цикла будет равно 3. Это значение и будет использоваться во всех трех отложенных вызовах fmt.Println
.
Таким образом, ваш код выведет:
1 2 3 |
Index: 3 Index: 3 Index: 3 |
Если вы хотите, чтобы печатались значения i
в обратном порядке 2, 1, 0, можно использовать замыкание, чтобы зафиксировать текущее значение i
на каждой итерации:
1 2 3 4 5 6 7 8 9 10 |
package main import "fmt" func main() { for i := 0; i < 3; i++ { i := i // создаем новую переменную i в текущей области видимости defer fmt.Println("Index:", i) } } |
Теперь вывод будет следующим:
1 2 3 |
Index: 2 Index: 1 Index: 0 |
Каждая итерация сохраняет текущее значение i
на момент создания defer
, что соответствует вашим ожиданиям.