聊聊golang的defer的使用
作者:codecraft 时间:2023-07-21 13:15:02
序
本文主要研究一下golang的defer
defer
return先赋值(对于命名返回值),然后执行defer,最后函数返回
defer函数调用的执行顺序与它们分别所属的defer语句的执行顺序相反
defer后面的表达式可以是func或者是method的调用,如果defer的函数为nil,则会panic
实例
实例1
// f returns 42
func f() (result int) {
defer func() {
// result is accessed after it was set to 6 by the return statement
result *= 7
}()
return 6
}
这里return先给result赋值为6,之后执行defer,result变为42,最后返回42
实例2
func f() int {
result := 6
defer func() {
// result is accessed after it was set to 6 by the return statement
result *= 7
}()
return result
}
这里return确定返回值6,之后defer修改result,最后函数返回return确定的返回值
实例3
func multiDefer() {
for i := 3; i > 0; i-- {
defer func(n int) {
fmt.Print(n, " ")
}(i)
}
for i := 3; i > 0; i-- {
defer fmt.Print(i, " ")
}
}
多个defer函数,按顺序逆序执行,这里输出1 2 3
实例4
var fc func() string
func main() {
fmt.Println("hello")
defer fc()
}
由于defer指定的func为nil,这里panic
实例5
func main() {
for i := 3; i > 0; i-- {
defer func() {
fmt.Print(i, " ")
}()
}
}
由于defer这里调用的func没有参数,等执行的时候,i已经为0,因而这里输出3个0
小结
defer可以拆解为return赋值,defer执行,最后代码返回三步;defer的顺序按逆序执行。
doc
Defer_statements
Golang之Defer
golang中defer执行时机与常见问题
来源:https://segmentfault.com/a/1190000038348618
标签:golang,defer
0
投稿
猜你喜欢
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2021-02-07 14:24:18
php中-> 、=>、::、$this->四种常见符号使用方法技巧
2023-05-30 07:46:24
解决vue项目获取dom元素宽高总是不准确问题
2024-04-28 09:32:14
第一类工厂与哈希对象
2009-12-28 13:14:00
Python利用matplotlib实现制作动态条形图
2021-06-11 05:29:15
使用python从三个角度解决josephus问题的方法
2022-02-22 02:19:55
PyTorch 如何自动计算梯度
2023-08-13 14:44:20
OpenCV Python实现拼图小游戏
2021-07-30 18:10:34
python获取指定时间段内特定规律的日期列表
2021-02-09 02:16:25
Python设计模式之外观模式实例详解
2022-01-18 16:39:37
教你如何使用Python selenium
2022-05-15 11:13:50
Python IDLE清空窗口的实例
2023-11-22 17:59:23
Ext2.0.2经典的一个JS组件(带EXT中文手册)
2009-04-13 12:24:00
简单实用的图片播放器1.0(Javascript + css )
2008-07-16 10:39:00
《写给大家看的设计书》阅读笔记之重复原则
2009-07-12 15:36:00
分享10个Js的小型库,效果真的很棒
2009-08-27 15:38:00
Django 对IP访问频率进行限制的例子
2022-02-14 05:40:38
深入讲解Python函数中参数的使用及默认参数的陷阱
2022-04-21 20:09:14
巧妙的自关联运用
2012-10-07 10:55:58
asp 删除数据并同时删除图片的代码
2011-02-28 10:39:00