go语言中defer执行顺序

defer 执行顺序和调用顺序相反, 类似于栈后进先出。

defer在 return 之后执行,但在函数推出之前,defer可以修改返回值。

Go 复制代码
func test() int {
	i := 0
	defer func() {
		fmt.Println("defer1")
	}()
	defer func() {
		i += 1
		fmt.Println("defer2")
	}()
	return i
}

func main() {
	fmt.Println("return", test())
}
// defer2
// defer1
// return 0

上面的例子中,test返回值并没有修改,这是由于Go的返回机制决定的,执行Return语句后,Go会创建一个临时变量保存返回值。如果是有名返回(也就是指明返回值 func test() (i int) {...})

Go 复制代码
func test() (i int) {
	i = 0
	defer func() {
		i += 1
		fmt.Println("defer2")
	}()
	return i
}

func main() {
	fmt.Println("return", test())
}
// defer2
// return 1

这个例子中,返回值被修改了。对于有名返回值的函数,执行return语句时,并不会再创建临时变量保存,因此defer语句修改了 i,即对返回值产生了影响

相关推荐
2301_79574179几秒前
模板编译期机器学习
开发语言·c++·算法
qq_4160187210 分钟前
模板错误消息优化
开发语言·c++·算法
杰克尼21 分钟前
知识点总结--02(java基础部分)
java·开发语言·jvm
Sunshine for you22 分钟前
C++中的对象池模式
开发语言·c++·算法
暮冬-  Gentle°35 分钟前
编译器优化屏障使用
开发语言·c++·算法
华科大胡子40 分钟前
此电脑网络位置异常的AD域排错指南
开发语言·php
Loadings41 分钟前
聊聊 AI Coding 的最新范式:Harness Engineering:我们这群程序员,又要继续学了?
前端·后端
ssshooter43 分钟前
哈希是怎么被破解的?
前端·后端
m0_730115111 小时前
模板编程中的SFINAE技巧
开发语言·c++·算法
荒古前1 小时前
Spring Boot + MyBatis 启动报错:不允许有匹配 “[xX][mM][lL]“ 的处理指令目标
spring boot·后端·mybatis