面试题答案
一键面试1. recover机制应对不可预见错误的基本工作原理
- 在Go语言中,
panic
用于主动抛出一个运行时错误,当panic
发生时,当前函数会立即停止执行,其调用栈中的所有函数都会依次被终止,直到程序崩溃或者遇到recover
。 recover
是一个内置函数,只能在defer
函数中使用。当recover
被调用时,如果当前的goroutine
正处于panic
状态,它会捕获panic
时传入的参数,从而使goroutine
恢复正常执行,调用栈不会继续展开,程序也不会崩溃。如果当前goroutine
没有处于panic
状态,recover
调用将返回nil
。
2. 示例代码
package main
import (
"fmt"
)
func divide(a, b int) int {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到panic:", r)
}
}()
if b == 0 {
panic("除数不能为零")
}
return a / b
}
func main() {
result := divide(10, 0)
fmt.Println("结果:", result)
}
在上述代码中:
divide
函数用于执行除法运算。- 函数内部使用
defer
定义了一个匿名函数,在函数结束时会被调用。 - 如果
b
为0,函数会panic
,defer
中的匿名函数会捕获到这个panic
,输出错误信息,避免程序崩溃。 - 在
main
函数中调用divide
函数,即使divide
函数发生panic
,程序也不会崩溃,且会输出捕获到的错误信息。但由于panic
发生后return a / b
这行代码不会执行,所以result
变量实际上不会被赋值为正确的结果。