面试题答案
一键面试-
执行顺序阐述:
defer
语句会将其后面的函数调用延迟到包含该defer
语句的函数即将返回时执行。多个defer
语句会按照后进先出(LIFO)的顺序执行。panic
用于抛出一个运行时错误,当panic
发生时,当前函数会立即停止执行,其所有的defer
语句会按照LIFO顺序执行。然后,panic
会向上传递到调用栈的上一层函数,重复这个过程,直到程序崩溃或者被recover
捕获。recover
只能在defer
函数中使用,用于捕获panic
。当recover
被调用时,如果当前的goroutine
正处于panic
状态,它会捕获panic
的值并停止panic
的传播,使程序可以继续正常执行。
-
示例代码:
package main
import (
"fmt"
)
func innerMost() {
defer func() {
if r := recover(); r != nil {
fmt.Println("InnerMost recovered:", r)
}
}()
panic("InnerMost panic")
}
func middle() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Middle recovered:", r)
}
}()
innerMost()
}
func outer() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Outer recovered:", r)
}
}()
middle()
}
func main() {
outer()
fmt.Println("Program continues after panic handling")
}
在这个示例中:
innerMost
函数引发了一个panic
。- 由于
innerMost
函数中有defer
语句,在panic
发生时,defer
函数会执行,尝试捕获panic
。 - 如果
innerMost
函数没有捕获panic
,panic
会传播到middle
函数,middle
函数的defer
语句会执行,尝试捕获panic
。 - 同理,如果
middle
函数没有捕获panic
,panic
会传播到outer
函数,outer
函数的defer
语句会执行,尝试捕获panic
。 - 无论哪个函数捕获了
panic
,程序都不会崩溃,并且main
函数中的后续代码可以继续执行。