当前位置:网站首页>【go】defer的使用
【go】defer的使用
2022-07-29 05:20:00 【本本的香菜】
卸载前面
第一次看go基础语法的时候,用使用到了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
defer func(a int) {
fmt.Println(a)
}(x)
x++
答案:
为什么
因为defer后面的函数在入栈的时候保存的是入栈那一刻的值,而当时x的值是10,所以后期对x修改,并不会影响栈内函数的值。
2.输出多少
x := 10
defer func(a *int) {
fmt.Println(*a)
}(&x)
x++
答案:
为什么
这里defer后面函数入栈的时候存入的执行变量x的指针。所以,后期x值改变的时候,输出结果也会改变。
3.输出多少
func test()(x int) {
x = 10
defer func() {
x++
}()
return x
}
答案:
为什么
之前我们说过,return并不是原子性操作,是通过一个变量赋值和ret指令来完成的。
而上述例子中,是具名函数。即返回值带有名字。这样我们在执行defer的时候相当于修改了返回值的值。所以为11
看到这里,博主想到了闭包。和闭包有没有关系呢?
4.输出什么
func test1() int {
x := 10
defer func() {
x++
}()
// ans = x
// -------- defer x = x+1
// return x
return x
}
答案:
为什么
还是return语句的原因,博主已经在代码中给出提示。可见,非具名函数不会受到相应的影响。
对于defer暂时理解了这些,下次再见。
边栏推荐
- “山东大学移动互联网开发技术教学网站建设”项目实训日志四
- 7 月 28 日 ENS/USD 价值预测:ENS 吸引巨额利润
- C# 连接 SharepointOnline WebService
- DeFi 2.0的LaaS协议,重振DeFi赛道发展的关键
- The bear market is slow, and bit.store provides stable stacking products to help you get through the bull and bear market
- NIFI 改UTC时间为CST时间
- 运动健康深入人心,MOVE PROTOCOL引领品质生活
- day02作业之进程管理
- Starfish OS:以现实为纽带,打造元宇宙新范式
- July 28 ens/usd Value Forecast: ENS attracts huge profits
猜你喜欢

Breaking through the hardware bottleneck (I): the development of Intel Architecture and bottleneck mining

“山东大学移动互联网开发技术教学网站建设”项目实训日志一

How can Plato obtain premium income through elephant swap in a bear market?

Starfish OS: create a new paradigm of the meta universe with reality as the link

量化开发必掌握的30个知识点【什么是分笔逐笔数据】?

裸金属云FASS高性能弹性块存储解决方案

CMD window under Windows connects to MySQL and operates the table

The openatom openharmony sub forum was successfully held, and ecological and industrial development entered a new journey

Laravel service container (Application of context binding)

ReportingService WebService Form身份验证
随机推荐
大部分PHP程序员,都搞不懂如何安全代码部署
rsync+inotyfy实现数据单项监控实时同步
Windows下cmd窗口连接mysql并操作表
麦当娜“Hellbent”购买130万美元的nft无聊猿,现在被认为太贵了
The difference between link and @import importing external styles
熊市慢慢,Bit.Store提供稳定Staking产品助你穿越牛熊
Xsan is highly available - xdfs and San are integrated with new vitality
Reporting Services- Web Service
Okaleido tiger logged into binance NFT on July 27, and has achieved good results in the first round
Elastic box flex
山寨币SHIB 在 ETH 鲸鱼的投资组合中拥有 5.486 亿美元的股份——交易者应提防……
与张小姐的春夏秋冬(4)
改哭了,终于解决了Cannot read properties of undefined (reading ‘parseComponent‘)
华为2020校招笔试编程题 看这篇就够了(下)
量化开发必掌握的30个知识点【什么是Level-2数据】
XDFS&空天院HPC集群典型案例
完全去中心化的编程模式,不需要服务器,也不需要ip,就像一张漫无目的的网络、四处延伸
焕然一新,swagger UI 主题更改
“山东大学移动互联网开发技术教学网站建设”项目实训日志六
我的理想工作,码农的绝对自由支配才是最重要的——未来创业的追求