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

相关推荐
老青蛙3 分钟前
权限系统设计-功能设计
后端
粘豆煮包3 分钟前
脑抽研究生Go并发-1-基本并发原语-下-Cond、Once、Map、Pool、Context
后端·go
CHANG_THE_WORLD4 分钟前
C++ 内存模型:用生活中的例子理解并发编程
开发语言·c++·生活
闯闯桑17 分钟前
toDF(columns: _*) 语法
开发语言·前端·spark·scala·apache
滴滴滴嘟嘟嘟.17 分钟前
Qt图表功能学习
开发语言·qt·学习
charlie11451419132 分钟前
Android开发——初步了解AndroidManifest.xml
android·xml·开发语言·学习·安卓·安全架构
IT_陈寒41 分钟前
Vite5.0性能翻倍秘籍:7个极致优化技巧让你的开发体验飞起来!
前端·人工智能·后端
Edward.W1 小时前
用 Go + HTML 实现 OpenHarmony 投屏(hdckit-go + WebSocket + Canvas 实战)
开发语言·后端·golang
努力努力再努力wz1 小时前
【c++进阶系列】:万字详解AVL树(附源码实现)
java·运维·开发语言·c++·redis
南囝coding1 小时前
Claude 封禁中国?为啥我觉得是个好消息
前端·后端