go学习笔记:panic是什么含义

panic 是 Go 语言中的一种运行时错误处理机制,用于处理程序中的异常情况。

基本含义

panic 会:

  1. 立即停止当前函数的执行
  2. 开始执行 defer 函数(如果有的话)
  3. 向上传播到调用栈,逐层执行 defer
  4. 如果到达 main 函数,程序会崩溃并退出

语法

panic(interface{}) 

使用场景

panic 通常用于:

  1. 不可恢复的错误(如数组越界、空指针解引用)
  2. 程序逻辑错误
  3. 初始化失败
  4. 手动触发 panic(不推荐)

示例

1. 自动触发的 panic

func main() {     // 数组越界会触发 panic     arr := []int{1, 2, 3}     fmt.Println(arr[10]) // panic: runtime error: index out of range } 

2. 手动触发 panic

func divide(a, b int) int {     if b == 0 {         panic("除数不能为零")     }     return a / b } 

3. defer 与 panic

func main() {     defer fmt.Println("程序结束")     defer fmt.Println("清理资源")          panic("发生错误")          fmt.Println("这行不会执行") } // 输出: // 清理资源 // 程序结束 // panic: 发生错误 

recover 函数

recover 用于捕获 panic,只能在 defer 函数中使用:

func handlePanic() {     defer func() {         if r := recover(); r != nil {             fmt.Println("捕获到 panic:", r)         }     }()          panic("测试 panic") }  func main() {     handlePanic()     fmt.Println("程序继续运行") } 

panic vs log.Fatal

特性 panic log.Fatal
执行 defer ✅ 会执行 ❌ 不会执行
可恢复 ✅ 可用 recover ❌ 不可恢复
程序退出 会退出 会退出
错误信息 打印堆栈信息 只打印错误信息

最佳实践

  1. 避免手动使用 panic,除非是真正的不可恢复错误
  2. 使用 error 返回值处理可预期的错误
  3. 在 defer 中使用 recover 来优雅处理 panic
  4. 在 main 函数或 init 函数中使用 panic 处理初始化错误
func main() {     defer func() {         if r := recover(); r != nil {             log.Printf("程序异常退出: %v", r)         }     }()          // 初始化代码     if err := initialize(); err != nil {         panic("初始化失败: " + err.Error())     }          // 正常程序逻辑 } 

发表评论

评论已关闭。

相关文章

当前内容话题