Будет напечатано 0: аргумент fmt.Println вычисляется при регистрации defer, до того как второе отложенное действие увеличит a.
Какой вывод появится в консоли (пример 46)
Будет напечатано 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 нельзя размещать на уровне пакета.