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

相关推荐
码事漫谈16 小时前
时序数据库2026盘点:国产数据库如何以“融合多模”走出差异化之路?
前端·后端
浮游本尊16 小时前
Java学习第42天 - Spring 事务传播、隔离级别、锁机制与并发一致性
后端
道友可好16 小时前
让 AI 自己验收,等于让学生自己批卷
前端·人工智能·后端
鱼人16 小时前
响应式三巨头:rem / vw / em 深度对比,移动端到底该选谁?
后端
小强198816 小时前
Grid 网格布局实战:快速实现复杂网页排版
后端
胡志辉16 小时前
深入浅出 call、apply、bind
前端·javascript·后端
长大198816 小时前
Flex 布局完整教程:告别浮动,拥抱万能弹性布局
后端
iccb101317 小时前
5年,一个程序员是如何把私有化在线客服系统做到第一名的
前端·后端·github
Rust研习社17 小时前
这 8 个 Rust 学习资源值得每个新手收藏起来
后端·rust·编程语言
Nturmoils17 小时前
ksql 里这些命令不用加分号,但日常查库少不了
后端