golang中的defer函数和return语句两者的执行顺序
2021/8/21 23:09:27
本文主要是介绍golang中的defer函数和return语句两者的执行顺序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
首先要明白,return是非原子性的,需要两步,首先要将返回值放到一个临时变量中(为返回值赋值),然后将返回值返回到被调用处。而defer函数恰在return的两个操作之间执行。
真正的执行顺序是:
先为返回值赋值,即将返回值放到一个临时变量中,然后执行defer,然后return到函数被调用处。
如果所在函数为有名返回值函数,return第一步先把返回值放到有名返回值变量中,如果恰好defer函数中修改了该返回值,那么最终返回值是更新后的。但是如果所在函数为无名返回值函数,那么return第一步先把返回值放到一个临时变量中,defer函数无法获取到这个临时变量地址,所以无论defer函数做任何操作,都不会对最终返回值造成任何变动。
看下面这个例子可以很好的理解:
测试用例1:无名返回值(即函数返回值为没有命名的返回值)
package main import ( "fmt" ) func main() { fmt.Println("return:", Demo()) // 打印结果为 return: 0 } func Demo() int { var i int defer func() { i++ fmt.Println("defer2:", i) // 打印结果为 defer: 2 }() defer func() { i++ fmt.Println("defer1:", i) // 打印结果为 defer: 1 }() return i }
执行结果:
defer1: 1 defer2: 2 return: 0
测试用例2:有名返回值(函数返回值为已经命名的返回值)
package main import ( "fmt" ) func main() { fmt.Println("return:", Demo2()) // 打印结果为 return: 2 } func Demo2() (i int) { defer func() { i++ fmt.Println("defer2:", i) // 打印结果为 defer: 2 }() defer func() { i++ fmt.Println("defer1:", i) // 打印结果为 defer: 1 }() return i // 或者直接 return 效果相同 }
执行结果:
defer1: 1 defer2: 2 return: 2
参考:Go语言中defer和return执行顺序解析
这篇关于golang中的defer函数和return语句两者的执行顺序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站