Что выведет код Junior Ошибки, defer, panic и recover спрашивают часто обновлено

Что выведет Go: порядок defer и вычисление аргументов

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.

package main

import "fmt"

func main() {
    for i := 0; i < 3; i++ {
        defer fmt.Print(i, " ")
    }
    x := 10
    defer fmt.Println("x =", x)
    x = 20
    fmt.Print("start ")
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: start x = 10, 2 1 0. Отложенные вызовы выполняются в обратном порядке.

Что выведет

start x = 10
2 1 0

Разбор

Отложенные вызовы выполняются в обратном порядке. Последним отложен Println с x, его аргумент вычислен сразу (10), он выполнится первым после start . Затем Print из цикла в обратном порядке: 2, 1, 0 (аргументы тоже зафиксированы в момент defer).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме