面试题答案
一键面试package main
import (
"fmt"
)
func riskyOperation() error {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到panic:", r)
}
}()
var arr [5]int
returnValue := arr[10] // 模拟数组越界访问,会触发panic
return nil
// 这里实际无法执行到,仅为了避免编译错误。
// 实际上捕获到panic后,函数应返回错误信息
}
func main() {
err := riskyOperation()
if err != nil {
fmt.Println("错误:", err)
}
}
以上代码可优化为:
package main
import (
"fmt"
)
func riskyOperation() error {
defer func() {
if r := recover(); r != nil {
return fmt.Errorf("数组访问越界")
}
}()
var arr [5]int
_ = arr[10] // 模拟数组越界访问,会触发panic
return nil
}
func main() {
err := riskyOperation()
if err != nil {
fmt.Println("错误:", err)
}
}
优化后的代码,在defer
函数中捕获panic
并返回有意义的错误信息。在实际应用中,建议将错误返回给调用者进行处理。
- 定义
riskyOperation
函数,该函数内部会执行可能引发panic
的操作。 - 使用
defer
关键字定义一个匿名函数,这个匿名函数会在riskyOperation
函数结束时执行(无论是否发生panic
)。 - 在匿名函数中,使用
recover
函数捕获panic
。如果捕获到panic
,则返回一个表示“数组访问越界”的错误信息。 - 在
main
函数中调用riskyOperation
函数,并检查返回的错误。如果有错误,则打印错误信息。