Go语言学习笔记十五--资源管理与错误处理-defer

Golang defer 与 panic_recover 的完美配合实战 本文旨在全面解析Golang中defer、panic和recover三个关键机制的工作原理及其协同配合方式。我们将深入探讨这些机制的设计初衷、实现原理以及在实际开发中的最佳实践。文章将从基础概念入手,逐步深入探讨defer、panic和recover的交互机制,通过代码示例和性能分析展示其实际应用,最后总结最佳实践和常见陷阱。defer:Golang中的延迟执行语句,用于确保函数退出前执行某些操作panic:Golang中的异常抛出机制,会导致程序异常中断recover。 阅读详情

defer概念

defer其实就相当于Java中的try{}finally{}中finally用法.我们看一下defer的定义:

简单使用:

func tryDefer() {
    file, err := os.Open("README.md")
    if err!=nil {
        panic(err)
    }
    defer file.Close()//直接在这里写下关闭就好,需要管顺序
    loop.PrintContentFile(file)//这是之前介绍文件读取定义的,打印文件函数
}

特性

  • 确保调用函数在结束时(代码执行完或return)发生.这个于Java的finally代码块使用.
  • 参数在defer语句时计算
func tryDefer() {
    for i := 0; i < 100; i++ {
        defer fmt.Println(i)
        if i == 10 {
            panic("num too big")

        }
    }
}

打印:

10
9
8
7
6
5
4
3
2
1
0
panic: num too big

goroutine 1 [running]:
main.tryDefer()
    /Users/cdz/go/src/com.cdz/learngo/errhandling/defer/defer.go:29 +0x183
main.main()
    /Users/cdz/go/src/com.cdz/learngo/errhandling/defer/defer.go:36 +0x20

从打印过程可以看出,defer语句后使用的参数,在调用时就已经计算,且进入defer栈内,最后当函数退出时,遵循先进后出的原则.

  • defer列表为后进先出
func tryDefer() {
    defer fmt.Println(2)
    fmt.Println(1)
    defer fmt.Println(3)
    return
}

打印:

    1
    3
    2

说明在defer中,只有在方法执行完前,或者方法return之前才会执行不影响原有代码,
且多个defer是有一个栈的,遵循后进先出的原则。

综合事例

将 上一篇斐波那契数列写入一个文件中.


func writFile(filename string) {
    file, e := os.Create(filename)
    if e != nil {
        panic(e)
    }
    defer file.Close() //可以看到正常使用时去关闭就好,不需要过多注意
    writer := bufio.NewWriter(file)
    defer writer.Flush()
    fibonacci := fib.Fibonacci()
    for i:=0;i<=20 ;i++  {
        fmt.Fprintln(writer,fibonacci())
    }
}

defer使用场景

  • open/close
  • lock/unlock
  • priintHeader/printFooter

作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star?

【Go语言从新手到高手】初阶篇-第4章 错误处理 4.2 defer, panic, recover 在Go语言中,panic是一种运行时错误,它会中断程序的正常执行,并打印出错误信息。panic通常是由程序员有意触发,或者由运行时错误(如数组越界、空指针引用等)引起。recover是Go语言的一个内置函数,专门用于捕获panic异常并恢复程序。当一个goroutine中发生panic时,如果在该goroutine中有defer函数调用了recover,那么程序就可以从panic中恢复,而不是直接崩溃。= nil {// 记录错误日志// 发送通知}() 阅读详情

相关推荐

基于集成运放心电放大器设计(原创)

原创作者:einyboy or alert 最近在看美剧《危机边缘》关于边缘科学的案件,科技控可以看一下,但建议不在吃东西的时候看。想像力是创造的思想源头,动手能力则是创造的车床。 自认为是没有想像力的那类,只能发挥动手能力了。 心电测量简介 图1 心电极接线图 如图1心电测试一般使用3个心电极进行测量,各个电极的说明如下: RA: Right Arm缩写,右手电极 LA: L...

huandaohack的专栏 6923

Go语言中的Defer:资源管理利器

Defer是Go语言中用于延迟执行函数调用的一个关键字,它是资源管理的重要工具。通过理解Defer的原理和最佳实践,我们可以编写更加清晰、可靠的代码。及时释放资源:在获取资源后立即使用defer注意执行顺序:defer按照后进先出的顺序执行参数求值时机:defer的参数在defer时求值避免循环中的defer:在循环中使用defer要谨慎性能考虑:defer有性能开销,避免过度使用错误处理:在defer中正确处理错误。

好代码自己会说话,烂代码才需要注释来圆谎 1152

深入解析国家企业征信系统瑞数6vmp算法逆向实战

本文深入解析了国家企业征信系统所采用的双层防护机制,重点聚焦于瑞数6代vmp算法的逆向实战。文章详细拆解了从加速乐521状态码的绕过,到瑞数412挑战的核心算法还原过程,提供了通过动态Hook、日志分析进行算法逆向,并用Python实现自动化请求链的完整技术方案,旨在为安全研究与技术学习提供参考。

yellow的专栏 607

【Golang进阶】第七章:错误处理与defer——从优雅回收到异常恢复

本章重点显式错误检查与defer的黄金搭档模式的正确应用场景与限制事务处理等关键场景的容错设计下节预告:第八章《并发编程基础》将深入Goroutine调度模型与Channel通信机制!代码资源(包含事务管理器完整实现、性能对比测试用例)扩展思考如何实现类似的自动资源管理?(提示:结合结构体方法与defer设计资源管理接口)

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 912

【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解

2025年五一数学建模竞赛 A题:基于历史数据与模式识别的道路车流量推测模型研究

Magnolia_He的博客 3783

物联网定位技术|实验报告|实验一 Wi-Fi指纹定位

全球定位系统是迄今为止应用最为成功的地位系统,具备高精度的定位能力,但在室内和高楼密布的城区等信号遮挡严重的密集环境中,由于接受机捕获不到足够强度的卫星信号,GPS的定位质量难以保证甚至无法完成定位,使其可用性受到严重制约。由于室内环境下都普及了WiFi,因此利用WiFi进行定位无需额外部署硬件设备,是一个非常节省成本的方法。

m0_57656758的博客 3356

golang笔记08--go语言错误处理和资源管理

golang笔记08--go语言错误处理和资源管理1 介绍2 错误处理和资源管理2.1 defer调用2.2 错误处理概念2.3 服务器统一出错处理2.4 panic和recover2.5 服务器统一出错处理23 注意事项4 说明 1 介绍 本文继上文 golang笔记07–go语言函数式编程, 进一步了解 go语言的错误处理和资源管理,以及相应注意事项。 具体包括 : defer调用 、错误处理概念、服务器统一出错处理、panic和recover、服务器统一出错处理2 等内容。 2 错误处理和资源管理 2

脚步不能达到的地方,眼光可以达到;眼光不能达到的地方,精神可以飞到 445

Windows下用MSYS2一键搞定Verilator安装(附国内镜像加速)

本文详细介绍了在Windows系统下,如何利用MSYS2工具和国内镜像源,快速、高效地完成Verilator的安装与配置。通过替换清华镜像源加速下载,并配合Pacman包管理器,实现近乎一键式的安装流程,有效解决了传统方法步骤繁琐、网络依赖下载慢的问题,为数字电路仿真提供了便捷的Windows环境解决方案。

weixin_29208327的博客 591

Go的defer原理

Go的defer原理

热爱C++和golang的学生 1349

DDR5 的 PI: DIMM 上 PMIC,正在制造一批“新型 EMI 问题”

DDR5 的 PI,不再只是“供电设计”,而是一次“噪声管理设计”。电压稳定本地调节高频噪声EMI 风险系统不确定性DDR5 真正难的地方,不是跑起来,而是——在最差条件下,它还能不能一直跑。而 DIMM 上那颗 PMIC,正是你绕不开的关键角色。

weixin_43199439的博客 179

【Golang】defer与recover的组合使用

必须将recover放在defer函数中,才能确保在panic发生后被动调用。

weixin_42430947的博客 1543

挂载(Mount)是什么意思

挂载 = 把一个存储设备或文件系统“接入”到现有的目录树,使其内容能够被访问。

天赐好车的博客 287

Go的错误处理defer、recover、panic

是用于处理错误和异常的关键机制。用于处理不可恢复的错误。

多多鱼的博客 494

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Golang Defer 必会知识点

Golang 中的一个关键字,用于延迟执行指定的函数调用。在程序执行到 defer 语句时,该函数调用会被推迟到当前函数返回之前执行,无论当前函数是正常返回还是发生异常退出。Defer 语句可以用来在函数执行完毕后清理资源,确保资源的释放不会被遗漏。通过使用 defer,我们能够更好地管理和控制代码执行流程。​的设计理念是基于资源管理的需要。在一些情况下,我们需要确保在函数返回前执行一些特定的操作,比如关闭文件、释放锁等。

1009

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Go 基础篇】Go语言中的defer关键字:延迟执行与资源管理

在Go语言中,defer是一种用于延迟执行函数调用的关键字。它提供了一种简洁而强大的方式,用于在函数返回之前执行一些必要的清理操作或者释放资源。defer的灵活性和易用性使得它在Go语言中广泛应用于资源管理、错误处理和代码结构优化等方面。本篇博客将详细介绍defer关键字的使用方法、延迟执行的特性、常见应用场景以及一些注意事项。通过深入了解defer,您将能够写出更加清晰、可维护的Go代码,避免资源泄漏和错误处理的问题。deferdefer。

繁依Fanyi的博客 1392

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

go中defer大杂烩

defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行。多个defer出现的时候,它会把defer之后的函数压入一个栈中延迟执行,也就是先进后出。defer后面的函数值在入栈的时候就决定了。defer 最大的功能是 panic 后依然有效,我们可以在defer中进行recover,如果defer中包含recover,则程序将不会再进行panic,实现try catch机制。juejin.cn通过八个demo搞明白Go语言defer的五大特性 | Go 技术论坛。

m0_73358879的博客 1090

defer的作用与设计思想

新年的第一天,迎着清晨的阳光,继续构筑我的魅力golang,今天带来的是defer,defer是golang独有的一个特殊的关健字,用于延迟函数的执行。当调用 defer 时,Go 会将被延迟的函数及其参数存储在栈中,并在函数结束时按照后进先出的顺序执行。首先是参数求值时机,如前所述,defer 的参数在声明时即被求值,因此后续对参数的修改不会影响被延迟的函数。多个 defer 按照后进先出的顺序执行。当 defer 被调用时,其后的函数会被推入一个延迟栈中,并在当前函数返回时按照后进先出的顺序执行。

网络风云的博客 5995

go的defer机制

•。

m0_61253599的博客 1171

【golang学习之旅】延迟调用——defer

在函数执行完毕后,可以及时地释放函数创建的资源,该操作不需要写在代码末尾(很容易忘记这个步骤),直接写在创建资源代码后面。后面的语句会依赖前面的资源,因此如果先前面的资源先释放了,后面的语句就没法执行了。这种机制让程序员不再为什么时机关闭资源而烦恼。defer 是先进后出的。,这和函数调用是一样的。

m0_60511809的博客 1322

go语言中defer用法详解

defer是 Go 语言中一个强大且灵活的工具,适用于资源管理、错误处理和其他需要在函数返回时执。

jkzyx123的博客 1184

Go 专栏|错误处理:defer,panic 和 recover,2024大厂Golang面试题精选

错误处理在开发过程中至关重要,好的错误处理可以使程序更加健壮。而且将错误信息清晰地记录日志,在排查问题时非常有用。Go 中使用error类型进行错误处理,还可以在此基础上自定义错误类型。使用defer语句进行延迟调用,用来关闭或释放资源。使用panic和recover来抛出错误和恢复。使用panic一般有两种情况:程序遇到无法执行的错误时,主动调用panic结束运行;在调试程序时,主动调用panic结束运行,根据抛出的错误信息来定位问题。为了程序的健壮性,可以使用recover。

2401_84301418的博客 1106

深入理解 Go 语言中的 defer 机制

本文深入解析Go语言中的defer机制,介绍了其基本语法、执行顺序(LIFO)以及在实际开发中的应用。通过文件操作、数据库连接等示例展示了defer在资源管理中的关键作用,并演示了如何结合recover进行异常处理。文章还展示了项目场景中defer的实用案例,如记录函数执行时间。defer能够确保资源释放和优雅的错误处理,是提升代码健壮性的重要工具,开发者应熟练掌握其使用方法。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1520

GO资源管理和错误处理

GO资源管理和错误处理资源管理 defer错误处理 panicpanicrecover 资源管理 defer 程序中的资源管理通常是指一些成对出现的操作,例如:文件的打开和关闭,数据库的连接和释放,这通常不是一件复杂的事情,但是程序可能出错从中间跳出来,导致资源得不到释放,最终会严重地影响系统的整体性能。GO语言是通过defer调用来实现资源管理的。Go垃圾回收(gc)是内存垃圾回收,分配给对象的...

weixin_39465456的博客 211

GoLang之defer、panic、recover

GoLang之defer、panic、recover

weixin_52690231的博客 1322

Go defer简介

defer是 Go 编程语言中的一个关键字,用于在函数执行结束后延迟执行指定的函数调用。defer的使用非常灵活,它通常用于执行一些清理操作、资源释放、日志记录等任务。以下是对deferdefer的语法。

Lamb的博客 496
上一篇: Go语言学习笔记十四--面向接口-函数式编程
cdzjava
博客等级 码龄10年 2粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值