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,即对返回值产生了影响

相关推荐
CVer儿几秒前
条件编译代码记录
开发语言·c++
凌不了云5 分钟前
windows环境下安装python第三方包
开发语言·python
落落落sss8 分钟前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
鸽芷咕11 分钟前
【Python报错已解决】python setup.py bdist_wheel did not run successfully.
开发语言·python·机器学习·bug
星迹日26 分钟前
C语言:联合和枚举
c语言·开发语言·经验分享·笔记
知识分享小能手29 分钟前
mysql学习教程,从入门到精通,SQL DISTINCT 子句 (16)
大数据·开发语言·sql·学习·mysql·数据分析·数据库开发
Huazzi.30 分钟前
算法题解:斐波那契数列(C语言)
c语言·开发语言·算法
意如流水任东西33 分钟前
[C++]类和对象(上)
开发语言·c++
我叫啥都行35 分钟前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
清纯世纪38 分钟前
基于深度学习的图像分类或识别系统(含全套项目+PyQt5界面)
开发语言·python·深度学习