Как работает defer внутри цикла for

Порядок вывода: start, end, 3, 2, 1, каждое значение на новой строке. Defer в цикле откладывается до выхода из функции, а не до конца итерации.

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

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

Порядок вывода: 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 замыканием, и изменение семантики переменных цикла здесь результат не меняет. При большом цикле учитывайте накопление отложенных операций и удерживаемых ресурсов.

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

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

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

Подробнее