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

相关推荐
特立独行的猫A13 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
码事漫谈15 小时前
我花了一周时间,看AI公司怎么"管"AI,结果越看越后背发凉
后端
大可不必了17 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus17 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道18 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛18 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
GISer_Jing18 小时前
Agent核心内容
后端·ai·langchain
budingxiaomoli19 小时前
Spring统一功能处理
java·后端·spring
eggwyw20 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
某鹏20 小时前
网关选型:Go、Java、Graal 谁都不能完胜
后端