Senior
// Сұрақ 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) } } }
sobes.tech AI
AI-дан жауап
Бұл кодта бірнеше маңызды сәттер бар:
defer fmt.Println(1)блок ішінде шақырылады, бірақ бұл кейінгі шақырылымдардың тәртібіне әсер етпейді — олар стекке қосылады.- Содан кейін
defer fmt.Println(2)шақырылады. - Одан кейін
panic("aaaa")шақырылады. panic-тен кейінrecover()-ды орындауға тырысатын функцияменdeferбар.
Алайда, 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" деп шығарар еді.