Сначала выводится 1, затем 0: defer исполняются в обратном порядке, а аргумент первого Println сохранён до изменения num.
Какой вывод получит консоль при выполнении программы №17
Сначала выводится 1, затем 0: defer исполняются в обратном порядке, а аргумент первого Println сохранён до изменения num.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, что будет напечатано в консоль после запуска следующей программы на Go:
import (
"fmt"
)
func main() {
num:=0
defer fmt.Println(num)
defer func(){
num++
fmt.Println(num)
}()
}
Ответ
Сначала выводится 1, затем 0: defer исполняются в обратном порядке, а аргумент первого Println сохранён до изменения num.
Первым зарегистрирован defer fmt.Println(num), который сразу вычисляет аргумент num = 0. Второе отложенное действие — замыкание, читающее переменную при выполнении.
При выходе замыкание увеличивает num до 1 и печатает его. Затем выполняется Println с ранее сохранённым нулём. Если бы первый defer тоже был замыканием, читающим num во время выполнения, он увидел бы уже изменённую переменную.