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

相关推荐
稚辉君.MCA_P8_Java2 分钟前
Gemini永久会员 三个线程(A、B、C)交替执行
java·后端·架构
lijiatu100865 分钟前
C++ 类成员变量声明语法错误
java·开发语言·c++
zore_c7 分钟前
【C语言】带你层层深入指针——指针详解2
c语言·开发语言·c++·经验分享·笔记
汝生淮南吾在北8 分钟前
SpringBoot+Vue超市收银管理系统
vue.js·spring boot·后端
p***930310 分钟前
SpringBoot + vue 管理系统
vue.js·spring boot·后端
Monly2113 分钟前
Java八股文:Redis篇
java·开发语言·redis
爱学习的程序媛20 分钟前
《JavaScript权威指南》核心知识点梳理
开发语言·前端·javascript·ecmascript
帮帮志24 分钟前
【AI大模型对话】流式输出和非流式输出的定义和区别
开发语言·人工智能·python·大模型·anaconda
陈奕昆24 分钟前
n8n实战营Day1课时2:核心概念拆解+天气提醒工作流实操
开发语言·人工智能·n8n
jquerybootstrap29 分钟前
大地2000转经纬度坐标
linux·开发语言·python