package main

Вывод: start, defer 3, recovered: boom, defer 2, defer 1. Recover останавливает панику, но выполнение после panic в 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.

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

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

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

Подробнее