Что выведет код Senior Ошибки, defer, panic и recover обновлено

Что выведет Go: defer при панике и повторная паника

Вопрос

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

package main

import "fmt"

func main() {
    defer func() {
        fmt.Println("recovered:", recover())
    }()
    defer func() {
        defer func() {
            fmt.Println("inner:", recover())
        }()
        panic("second")
    }()
    fmt.Println("start")
    panic("first")
}

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

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

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

Коротко

Код выведет: start, inner: second, recovered: first. Паника first запускает отложенные функции в обратном порядке.

Что выведет

start
inner: second
recovered: first

Разбор

Паника first запускает отложенные функции в обратном порядке. Вторая отложенная функция паникует second, и её собственный defer перехватывает именно эту новую панику. После этого раскрутка исходной паники first продолжается, и первый defer main ловит first.

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

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

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