当前位置:网站首页>【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暂时理解了这些,下次再见。
边栏推荐
- “山东大学移动互联网开发技术教学网站建设”项目实训日志三
- 完全去中心化的编程模式,不需要服务器,也不需要ip,就像一张漫无目的的网络、四处延伸
- iSCSI vs iSER vs NVMe-TCP vs NVMe-RDMA
- How to survive in the bear market of encryption market?
- 剑指核心-TaoCloud全闪SDS助力构建高性能云服务
- C# 判断用户是手机访问还是电脑访问
- 从Starfish OS持续对SFO的通缩消耗,长远看SFO的价值
- 浅谈分布式全闪存储自动化测试平台设计
- Training log 6 of the project "construction of Shandong University mobile Internet development technology teaching website"
- Markdown语法
猜你喜欢
闪贷Dapp的调研及实现
How can Plato obtain premium income through elephant swap in a bear market?
超简单集成HMS ML Kit 人脸检测实现可爱贴纸
Laravel service container (Application of context binding)
Go|Gin 快速使用Swagger
『全闪实测』数据库加速解决方案
"Shandong University mobile Internet development technology teaching website construction" project training log I
Thinkphp6 output QR code image format to solve the conflict with debug
大部分PHP程序员,都搞不懂如何安全代码部署
Super simple integration of HMS ml kit to realize parent control
随机推荐
Move protocol global health declaration, carry out the health campaign to the end
30 knowledge points that must be mastered in quantitative development [what is level-2 data]
Common prompt pop-up box of uniapp
XDFS&空天院HPC集群典型案例
Okaleido Tiger 7.27日登录Binance NFT,首轮已获不俗成绩
"Shandong University mobile Internet development technology teaching website construction" project training log V
7 月 28 日 ENS/USD 价值预测:ENS 吸引巨额利润
量化开发必掌握的30个知识点【什么是Level-2数据】
“山东大学移动互联网开发技术教学网站建设”项目实训日志四
ReportingService WebService Form身份验证
Thinkphp6管道模式Pipeline使用
Countdown of the uniapp component (such as the countdown to reading the agreement and the countdown to completing learning)
Novice introduction: download from PHP environment to thinkphp6 framework by hand
30 knowledge points that must be mastered in quantitative development [what is individual data]?
iSCSI vs iSER vs NVMe-TCP vs NVMe-RDMA
Fantom (FTM) 在 FOMC会议之前飙升 45%
熊市下PLATO如何通过Elephant Swap,获得溢价收益?
Strategic cooperation with many institutions shows the strength of the leading company of platofarm yuancosmos
rsync+inotyfy实现数据单项监控实时同步
day02 作业之文件权限