Go程序员踩过的defer坑如何处理


本文小编为大家详细介绍“Go程序员踩过的defer坑如何处理”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go程序员踩过的defer坑如何处理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先来一个简单的例子热热身:输出:done
second
first这个比较简单,defer语句的执行顺序是按调用defer语句的倒序执行。看看这段代码有什么问题?这段代码其实很危险,很可能会用尽所有文件描述符。因为defer语句不到函数的最后一刻是不会执行的,也就是说文件始终得不到关闭。所以切记,一定不要在for循环中使用defer语句。那怎么优化呢?可以将循环体单独写一个函数,这样每次循环的时候都免费云主机域名会调用关闭函数。如下:看看这三个函数的输出结果是什么?公布答案:你答对了吗?说实话刚开始看到这个结果时,我是相当费解,完全不知道怎么回事。但可以看到,这三个函数都有一个共同特点,它们都有一个命名返回值,并且都在函数中引用了这个返回值。引用的方式分两种:分别是闭包和函数参数。先看a()函数:闭包通过r++修改了外部变量,返回值变成了 1。相当于:再看b()函数:闭包内修改的只是局部变量t,而外部变量t不受影响,所以还是返回 5。相当于:最后是c函数:参数传递是值拷贝,实参不受影响,所以还是返回 1。相当于:那么,为了避免写出这么令人意外的代码,最好在定义函数时就不要使用命名返回值。或者如果使用了,就不要在defer中引用。再看下面两个例子:d=0
e=0返回值符合预期,再也不用绞尽脑汁猜了。输出如下,b没有打印出来。而如果defer在前,则可以执行。输出:看看下面这段代码的执行顺序:顺序如下:调用G()函数;调用F()函数;F()中遇到panic,立刻终止,不执行panic之后的代码;执行F()中defer函数,遇到recover捕获错误,继续执行defer中代码,然后返回;执行G()函数后续代码,最后执行G()中defer函数。输出:捕获异常:a
b
继续执行
c看看下面这段代码的执行顺序:顺序如下:调用G()函数;调用F()函数;F()中遇到panic,立刻终止,不执行panic之后的代码;执行F()中defer函数,由于没有recover,则将panic抛到G()中;G()收到panic则不会执行后续代码,直接执行defer函数;defer中捕获F()抛出的异常a,然后继续执行,最后退出。输出:b
捕获异常:a
c看看下面这段代码的执行顺序:顺序如下:调用G()函数;调用F()函数;F()中遇到panic,立刻终止,不执行panic之后的代码;执行F()中defer函数,由于没有recover,则将panic抛到G()中;G()收到panic则不会执行后续代码,直接执行defer函数;由于没有recover,直接抛出F()抛过来的异常a,然后退出。输出:b
c
panic:a
goroutine1[running]:
main.F()
xxx.go:90+0x5b
main.G()
xxx.go:82+0x48
main.main()
xxx.go:107+0x4a5
exitstatus2看看下面这段代码的执行顺序:顺序如下:调用G()函数;通过 goroutine 调用F()函数;F()中遇到panic,立刻终止,不执行panic之后的代码;执行F()中defer函数,由于没有recover,则将panic抛到G()中;由于 goroutine 内部没有进行recover,则 goroutine 外部函数,也就是G()函数是没办法捕获的,程序直接崩溃退出。输出:b
panic:a
goroutine6[running]:
main.F()
xxx.go:96+0x5b
createdbymain.G
xxx.go:87+0x57
exitstatus2recover返回的是interface {}类型,而不是error类型,所以这样使用的话会报错:可以这样来转换一下:或者直接打印结果:输出:捕获异常:a读到这里,这篇“Go程序员踩过的defer坑如何处理”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: 怎么使用Matlab绘制有趣的罗盘时钟

这篇文章主要介绍“怎么使用Matlab绘制有趣的罗盘时钟”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Matlab绘制有趣的罗盘时钟”文章能帮助大家解决问题。关于“怎么使用Matlab绘制有趣的罗盘时钟”的内容…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 03/13 12:31
Next 03/13 12:31

相关推荐