【Golang详解】go语言中的defer
2021/11/1 23:13:49
本文主要是介绍【Golang详解】go语言中的defer,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
defer
用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行
延迟函数的参数在defer语句出现时就已经确定下来了
如:
func a() { i := 0 defer fmt.Println(i) i++ return }
defer语句中的fmt.Println()参数i值在defer出现时就已经确定下来,实际上是拷贝了一份。后面对变量i的修改不会影响fmt.Println()函数的执行,仍然打印”0”。但是注意 这里对于指针类型参数,仍然适用,所以defer后面的语句对变量修改还是会影响延迟函数如:
func a() { i := []int{1,2,3} defer fmt.Println(i) i[0]=10 return }//会输出[10,2,3],因为这里i为指针,是数组的地址
先进后出
很好理解,延迟函数执行按先进后出顺序执行,即先进去的defer最后执行
延迟函数可能操作主函数的具名返回值
defer可能会改变返回值,因为return语句不是原子的,实际执行为设置返回值-->ret
defer语句实际执行在返回前,即拥有defer的函数返回过程是:设置返回值–>执行defer–>ret。
注意:这里返回值必须要有具体名字
如下:
func deferFuncReturn() (result int) { i := 1 defer func() { result++ }() return i }
输出2,return语句先把result设置为i的值,即1,defer语句又把result递增1,所以最终返回2
如果返回的是匿名变量,则不改变,如:
func foo() int { var i int i=1 defer func() { i++ }() return i }
这里还是返回1,上面的返回语句可以拆分成以下过程:
t=i //t就是要返回的值 i++ return //返回t,这里t还是1
defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic
这篇关于【Golang详解】go语言中的defer的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 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专业技术文章分享