面试题答案
一键面试package main
import (
"fmt"
)
// 模拟内层函数,可能触发 panic
func innerFunction() {
panic("Inner function panic")
}
// 中层函数,调用内层函数,并负责清理资源
func middleFunction() {
// 模拟打开文件描述符
fmt.Println("Middle function: Opening file descriptor")
defer func() {
// 模拟关闭文件描述符
fmt.Println("Middle function: Closing file descriptor")
}()
innerFunction()
}
// 最外层函数,捕获并处理内层函数的 panic
func outerFunction() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("Outer function caught panic: %v\n", r)
}
}()
middleFunction()
}
代码逻辑
innerFunction
:这是最内层函数,它简单地触发一个panic
。middleFunction
:此函数调用innerFunction
。同时,它通过defer
语句注册了一个匿名函数,用于在函数结束时清理资源(这里简单地打印关闭文件描述符的信息)。无论innerFunction
是否触发panic
,这个defer
函数都会在middleFunction
结束时执行。outerFunction
:这是最外层函数,它调用middleFunction
。通过defer
语句注册了一个匿名函数,在这个匿名函数中使用recover
来捕获可能来自内层函数的panic
。如果捕获到panic
,则打印出相关信息。
defer
和 recover
的作用
defer
:- 在
middleFunction
中,defer
用于注册资源清理函数。无论函数是正常结束还是因为panic
而结束,defer
注册的函数都会被执行,确保资源(如文件描述符)被正确清理。 - 在
outerFunction
中,defer
用于注册一个匿名函数,这个匿名函数用于捕获panic
。defer
的特性保证了这个捕获逻辑在函数即将结束时执行,无论函数是正常结束还是因为panic
而结束。
- 在
recover
:- 在
outerFunction
的defer
匿名函数中,recover
用于捕获panic
。当内层函数触发panic
时,recover
可以使程序从panic
状态中恢复,避免程序崩溃,并允许外层函数对panic
进行处理。
- 在
func main() {
outerFunction()
fmt.Println("Program continues after handling panic")
}
在 main
函数中调用 outerFunction
,可以看到程序在捕获并处理 panic
后继续执行。