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())
} // 正常程序逻辑
}

go学习笔记:panic是什么含义的更多相关文章

  1. opencv学习笔记——minMaxIdx函数的含义及用法

    opencv中有时需要对Mat数据需要对其中的数据求取最大值和最小值.opencv提供了直接的函数 CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT ...

  2. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  3. go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数

    温故知新不忘延迟基础 A "defer" statement invokes a function whose execution is deferred to the momen ...

  4. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  6. WeX5学习笔记

    目录 WeX5学习笔记... 1 1.轻松看透WeX5产品能力和技术... 1 2.WeX5可以怎么玩?... 3 一.纯本地App. 3 二.关联一个网站,希望默认就打开某页... 4 三.UI设计 ...

  7. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  8. RAC学习笔记

    RAC学习笔记 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾. 在学习Re ...

  9. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  10. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

随机推荐

  1. pyqt点击右上角关闭界面但子线程仍在运行

    现象: 通过右上角的叉关闭图形界面后,程序运行的子线程却不会被自动关闭,依然留存在系统中 原因: 子线程没有正确关闭 解决方法: 1.将子线程设置成守护线程 self.your_thread = th ...

  2. IDEA主题下载仓库地址

    拿去,不多BB https://plugins.jetbrains.com/search?tags=Theme

  3. odoo14里面开发一个简单的action.client 的tag 模板例子

    1.js模板  web_template.js odoo.define('web', function (require) { "use strict"; var core = r ...

  4. 面试题|Spring中BeanFactory与ApplicationContext的本质区别和作用

      BeanFactory 是Bean工厂,是Spring 框架最核心的接口,它提供了高级IoC 的配置机制.如果说BeanFactory是Spring的心脏,那么应用上下文ApplicationCo ...

  5. 慢查询导致任务执行hang住

    上线上了大半天,原因:因为慢查询了导致跑不出来,后来同事帮忙看了下发现慢查询了,程序hang住了 select * from table where cdate = '2023-02-01' and ...

  6. SAP STRANS 导出EXCEL

    第一次用strans是2014年,第二次就是2017年...最近看到有人在问EXCEL双表头的问题,想着就把STRANS导出EXCEL的方法保存下来吧.方便大家参考. 1.已经记不清到底改做哪些类型的 ...

  7. 从 DeepSeek 突然爆发,看数据开发的应用市场

    在数字化快速发展的当下,人工智能与数据技术不断迭代.近期,DeepSeek 凭借自身技术实力在市场中迅速崛起,为剖析数据开发应用市场提供了视角. DeepSeek 爆发:技术与市场的双重驱动 1.1 ...

  8. 袋鼠云秋季发布会圆满落幕,AI驱动让生产力数智化

    在当今时代,AI 的发展如汹涌浪潮,其速度之快超越了任何历史时期.它以前所未有的迅猛之势,渗入到各个领域的不同场景之中,悄然重塑着商业模式与人们的生活方式. 在 AI 逐渐成为企业基础属性的背景下,袋 ...

  9. UFT send email

  10. 五、kernel修改屏幕配置

    2.3.修改屏幕配置 2.3.1.配置 gpio 修改 ./rk_linux_sdk/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10. ...