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

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

基本含义

panic 会:

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

语法

go 复制代码
panic(interface{})

使用场景

panic 通常用于:

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

示例

1. 自动触发的 panic

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

2. 手动触发 panic

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

3. defer 与 panic

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

recover 函数

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

go 复制代码
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 处理初始化错误
go 复制代码
func main() {
    defer func() {
        if r := recover(); r != nil {
            log.Printf("程序异常退出: %v", r)
        }
    }()
    
    // 初始化代码
    if err := initialize(); err != nil {
        panic("初始化失败: " + err.Error())
    }
    
    // 正常程序逻辑
}