面试题答案
一键面试panic的使用场景
- 不可恢复的错误:当程序遇到无法继续正常执行的严重错误时,例如数组越界、空指针引用等Go语言运行时会自动触发panic。另外,在一些业务逻辑中,如果遇到不符合预期且无法继续执行的情况,也可以手动调用
panic
。比如在解析配置文件时,若配置格式严重错误,程序无法继续运行,就可以使用panic
。 - 快速失败机制:在程序初始化阶段,如果某些关键资源无法获取,如数据库连接失败、无法读取必要的系统配置等,为避免程序在不健康的状态下运行,可以使用
panic
让程序快速失败。
recover的使用结构
recover
一般在defer
函数中使用。defer
语句会将其后面跟随的函数推迟到包含该defer
语句的函数结束时执行。当panic
发生时,程序会立即停止当前函数的执行,开始执行defer
语句,此时recover
在defer
函数中可以捕获到panic
,并进行相应处理。
简单场景示例
package main
import (
"fmt"
)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
testPanic()
fmt.Println("This line will be printed after recovery")
}
func testPanic() {
panic("This is a test panic")
}
在上述代码中,testPanic
函数手动触发了一个panic
。在main
函数中,通过defer
语句定义了一个匿名函数,在这个匿名函数中使用recover
捕获panic
。当testPanic
触发panic
后,程序控制权转到defer
函数,recover
捕获到panic
信息并打印,main
函数后续的fmt.Println("This line will be printed after recovery")
语句得以继续执行。