面试题答案
一键面试panic触发场景
- 运行时错误:例如数组越界访问。比如有一个数组
a := [3]int{1, 2, 3}
,如果访问a[4]
,就会触发panic
,因为索引4超出了数组a
的有效范围(0到2)。 - 空指针引用:当试图对一个空指针进行解引用操作时会触发
panic
。例如var p *int; *p = 1
,这里p
是一个空指针,对其解引用赋值会引发panic
。 - 类型断言失败:在进行类型断言时,如果实际类型与断言的类型不匹配会触发
panic
。比如var i interface{} = "hello"; num := i.(int)
,这里将string
类型的i
断言为int
类型,会导致panic
。 - 显式调用
panic
函数:开发者可以在代码中主动调用panic
函数来触发异常。例如if someCondition { panic("自定义错误信息") }
。
使用defer和recover捕获并处理panic
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到panic:", r)
}
}()
// 模拟可能触发panic的操作
panic("这是一个测试panic")
fmt.Println("这行代码不会被执行")
}
在上述代码中,defer
注册了一个匿名函数。当外层函数(这里是 main
函数)发生 panic
时,defer
函数会被执行,recover
函数会尝试恢复程序的正常执行。如果 recover
捕获到了 panic
,就可以对其进行处理,例如打印错误信息等。如果没有 recover
,panic
会导致程序崩溃并打印出堆栈跟踪信息。