Вывод: start, defer 3, recovered: boom, defer 2, defer 1. Recover останавливает панику, но выполнение после panic в main не продолжается.
package main
Вывод: start, defer 3, recovered: boom, defer 2, defer 1. Recover останавливает панику, но выполнение после panic в main не продолжается.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
package main
import "fmt"
func main() { fmt.Println("start") defer fmt.Println("defer 1") defer fmt.Println("defer 2") defer func() { if r := recover(); r != nil { fmt.Println("recovered:", r) } }() defer fmt.Println("defer 3") panic("boom") fmt.Println("unreachable") }
Вопрос: Что выведет программа и почему?
Ответ
Вывод: start, defer 3, recovered: boom, defer 2, defer 1. Recover останавливает панику, но выполнение после panic в main не продолжается.
Программа напечатает:
start
defer 3
recovered: boom
defer 2
defer 1
Отложенные вызовы выполняются в обратном порядке регистрации. Сначала срабатывает последний defer 3, затем отложенная функция вызывает recover в той же горутине и перехватывает значение boom. Оставшиеся defer также выполняются, после чего main возвращается. Строка unreachable недостижима: recover не возвращает управление на следующую инструкцию после panic.