golang中defer怎么使用
导读:本文共1756字符,通常情况下阅读需要6分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 1.什么是deferdefer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,通常用于释放资源。2.defer的特点defer遵循先进后出的原则,类似于栈的结构。补充下:为什么要把defer设计成这种机制?因为后申请的资源和可能对前面申请的资源有依赖。如果先将前面申请的资源释放掉了。对于后面的资源可能会造成影响。所以先释放后申请的... ...
目录
(为您整理了一些要点),点击可以直达。1.什么是defer
defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,通常用于释放资源。
2.defer的特点
defer遵循先进后出的原则,类似于栈的结构。
补充下:为什么要把defer设计成这种机制?
因为后申请的资源和可能对前面申请的资源有依赖。如果先将前面申请的资源释放掉了。对于后面的资源可能会造成影响。所以先释放后申请的资源,再释放前面申请的资源。
3.defer什么时间执行
前面说到,defer只有在当前函数执行完毕后,才会执行。其实不太准确。
go中的return语句并不是原子性操作,一般是分为两步:
将返回值赋值给一个变量
执行RET指令
defer就执行在1之后,2之前。
4.defer常见的坑
1.输出是多少?
x:=10 deferfunc(aint){ fmt.Println(a) }(x) x++
答案:
为什么?
因为defer后面的函数在入栈的时候保存的是入栈那一刻的值,而当时x的值是10,所以后期对x修改,并不会影响栈内函数的值。
2.输出多少
x:=10 deferfunc(a*int){ fmt.Println(*a) }(&x) x++
答案:
为什么?
这里defer后面函数入栈的时候存入的执行变量x的指针。所以,后期x值改变的时候,输出结果也会改变。
3.输出多少
functest()(xint){ x=10 deferfunc(){ x++ }() returnx}
答案:
为什么?
之前我们说过,return并不是原子性操作,是通过一个变量赋值和ret指令来完成的。
而上述例子中,是具名函数。即返回值带有名字。这样我们在执行defer的时候相当于修改了返回值的值。所以为11
看到这里,博主想到了闭包。和闭包有没有关系呢?
4.输出什么
functest1()int{ x:=10 deferfunc(){ x++ }() //ans=x //--------deferx=x+1 //returnx returnx}
答案:
为什么?
还是return语句的原因,博主已经在代码中给出提示。可见,非具名函数不会受到相应的影响。
对于defer暂时理解了这些,下次再见。
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
golang中defer怎么使用的详细内容,希望对您有所帮助,信息来源于网络。