Какой вывод получит консоль при выполнении программы №17

Сначала выводится 1, затем 0: defer исполняются в обратном порядке, а аргумент первого Println сохранён до изменения num.

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

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

Сначала выводится 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 во время выполнения, он увидел бы уже изменённую переменную.

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

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

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

Подробнее