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
В данном коде есть несколько важных моментов:
defer fmt.Println(1)вызывается внутри блока, но это не влияет на порядок отложенных вызовов — они добавляются в стек.- Затем вызывается
defer fmt.Println(2). - После этого вызывается
panic("aaaa"). - После
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".