Sobes.tech
Back to questions
Senior
7

// Вопрос 2. Что выведет на экран package main import "fmt" func main() { { defer fmt.Println(1) } defer fmt.Println(2) panic("aaaa") defer func(){ if r := recover(); r != nil{ fmt.Println("Паника обработана", r) } } }

Companies where asked
МВидео/эльдорадо

Answer from AI

sobes.tech AI

В данном коде есть несколько важных моментов:

  1. defer fmt.Println(1) вызывается внутри блока, но это не влияет на порядок отложенных вызовов — они добавляются в стек.
  2. Затем вызывается defer fmt.Println(2).
  3. После этого вызывается panic("aaaa").
  4. После panic есть defer с функцией, которая пытается выполнить recover().

Однако, defer func(){...} объявлен после panic, то есть этот defer никогда не будет зарегистрирован, так как выполнение функции прервётся на panic.

Порядок выполнения:

  • При вызове panic начинают выполняться все отложенные вызовы в обратном порядке их регистрации.
  • Первым выполняется defer fmt.Println(2) — выводит 2.
  • Затем defer fmt.Println(1) — выводит 1.
  • defer func(){...} не зарегистрирован, так как объявлен после panic.
  • Паника не обработана, программа завершится с ошибкой.

Вывод на экран будет:

2
1
panic: aaaa

Если бы defer func(){...} был объявлен до panic, то он бы поймал панику и вывел "Паника обработана aaaa".