Порядок вывода: start, end, 3, 2, 1, каждое значение на новой строке. Defer в цикле откладывается до выхода из функции, а не до конца итерации.
Как работает defer внутри цикла for
Порядок вывода: start, end, 3, 2, 1, каждое значение на новой строке. Defer в цикле откладывается до выхода из функции, а не до конца итерации.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно предсказать, какой текст будет выведен на консоль, когда в теле цикла применяется оператор defer для отложенного вывода переменной.
func main() {
fmt.Println("start")
for i := 1; i < 4; i++ {
defer fmt.Println(i)
}
fmt.Println("end")
}
Ответ
Порядок вывода: start, end, 3, 2, 1, каждое значение на новой строке. Defer в цикле откладывается до выхода из функции, а не до конца итерации.
Аргумент fmt.Println(i) вычисляется при регистрации отложенного вызова, поэтому сохраняются 1, 2 и 3. Выполнение происходит в обратном порядке. Это не случай захвата i замыканием, и изменение семантики переменных цикла здесь результат не меняет. При большом цикле учитывайте накопление отложенных операций и удерживаемых ресурсов.