go学习笔记:panic是什么含义
anic
是 Go 语言中的一种运行时错误处理机制,用于处理程序中的异常情况。
基本含义
panic
会:
-
立即停止当前函数的执行
-
开始执行 defer 函数(如果有的话)
-
向上传播到调用栈,逐层执行 defer
-
如果到达 main 函数,程序会崩溃并退出
语法
panic(interface{})
使用场景
panic
通常用于:
-
不可恢复的错误(如数组越界、空指针解引用)
-
程序逻辑错误
-
初始化失败
-
手动触发 panic(不推荐)
示例
1. 自动触发的 panic
func main() {// 数组越界会触发 panicarr := []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,除非是真正的不可恢复错误
-
使用 error 返回值处理可预期的错误
-
在 defer 中使用 recover 来优雅处理 panic
-
在 main 函数或 init 函数中使用 panic 处理初始化错误
func main() {defer func() {if r := recover(); r != nil {log.Printf("程序异常退出: %v", r)}}()// 初始化代码if err := initialize(); err != nil {panic("初始化失败: " + err.Error())}// 正常程序逻辑
}
文章转载自:Lucas_coming
原文链接:go学习笔记:panic是什么含义 - Lucas_coming - 博客园
体验地址:JNPF快速开发平台