【Go语言基础【14】】defer与异常处理(panic、recover)

零、概述

关键字/函数 作用描述
defer 延迟执行函数,用于资源释放、日志记录等,按LIFO顺序执行
panic 触发异常,终止当前协程正常执行,可显式调用或由运行时错误触发
recover defer中捕获panic,恢复程序执行,避免崩溃
执行顺序 deferreturnpanic(若未捕获)
最佳实践 defer用于资源管理,panic/recover用于不可恢复的严重错误处理

注意事项:

  1. defer的性能影响
    • 每个defer会创建一个栈帧,过多使用可能影响性能(尤其在高频调用的函数中)。
    • 建议仅在必要场景(如资源释放)中使用defer,避免滥用。
  2. panic的合理使用
    • 不建议在业务逻辑中滥用panic,应优先使用多返回值(如(result, error))处理可预期的错误。
    • 推荐场景:处理不可恢复的严重错误(如配置文件缺失、数据库连接失败)。
  3. recover的作用范围
    • recover仅能捕获当前协程的panic,无法跨协程捕获(如其他goroutine中的panic)。
    • 跨协程异常处理需通过通道(channel)传递错误。

 

一、defer关键字:延迟执行机制

1. 基本原理

核心特性

  • 独立的defer栈,延迟执行defer修饰的函数或语句会在当前函数即将退出时执行(包括正常返回、panic异常或提前return)。
  • 栈存储:多个defer按**后进先出(LIFO)**顺序执行,先声明的后执行。
  • 值拷贝defer语句中的参数在声明时立即求值并拷贝,后续修改不影响其值。

 
defer的作用

一般用来做善后操作,例如清理垃圾、释放资源,无论是否报错都执行defer对象。另一方面,defer可以让这些善后操作的语句和开始语句放在一起,无论在可读性上还是安全性上都很有改善,毕竟写完开始语句就可以直接写defer语句,永远也不会忘记关闭、善后等操作

 

执行顺序示例

func deferOrder() {
   
   
    fmt.Println("开始执行")
    defer fmt.Println(" defer 1") // 压栈顺序:1 → 2 → 3
    defer fmt.Println(" defer 2")
    defer fmt.Println(" defer 3")
    fmt.Println("执行结束") // 先于 defer 执行
}
// 输出:
// 开始执行
// 执行结束
//  defer 3    (最后压栈,最先执行)
//  defer 2
//  defer 1

 

2. defer下变量的作用域

(1)值拷贝机制

func deferValueCopy() {
   
   
    x := 10
    defer fmt.Println("defer值拷贝:", x) // 声明时拷贝x的值(10)
    x = 20 // 修改不影响 defer 中的值
    fmt
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值