Какой вывод появится в консоли (пример 46)

Будет напечатано 0: аргумент fmt.Println вычисляется при регистрации defer, до того как второе отложенное действие увеличит a.

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

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

Будет напечатано 0: аргумент fmt.Println вычисляется при регистрации defer, до того как второе отложенное действие увеличит a.

Подробный разбор

Ответ с пояснениями

Условие

Какой результат будет напечатан после выполнения следующей программы:

a := 0
defer fmt.Println(a)
defer func() {a++}()

Ответ

Будет напечатано 0: аргумент fmt.Println вычисляется при регистрации defer, до того как второе отложенное действие увеличит a.

Оба defer выполняются при выходе из окружающей функции в обратном порядке. Сначала замыкание увеличивает a до 1, но сохранённый аргумент Println уже равен 0.

Чтобы печаталось итоговое значение, нужно отложить само чтение переменной: defer func() { fmt.Println(a) }(). Тогда после инкремента оно даст 1. Фрагмент должен находиться внутри функции; defer нельзя размещать на уровне пакета.

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

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

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

Подробнее