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

相关推荐
jf加菲猫13 小时前
第2章 Hello World
开发语言·c++·qt·ui
吴名氏.13 小时前
电子书《ASP.NET MVC企业级实战》
后端·asp.net·mvc·编程语言
IT_陈寒14 小时前
SpringBoot 3.2新特性实战:这5个隐藏技巧让你的应用性能飙升50%
前端·人工智能·后端
todoitbo14 小时前
Rust新手第一课:Mac环境搭建踩坑记录
开发语言·macos·rust
laplace012314 小时前
PyQt5 + Qt Designer配置指令
开发语言·qt
小奏技术14 小时前
LLM 交互的“省钱”新姿势:JSON 已死,TOON 当立
后端·aigc
用户214118326360214 小时前
mcp-server案例分享-即梦MCP-Server实战教程-让Claude直接调用AI生图视频能力
后端
席万里14 小时前
通过Golang订阅binlog实现轻量级的增量日志解析,并解决缓存不一致的开源库cacheflow
缓存·golang·开源
nvd1114 小时前
Python 迭代器 (Iterator) vs. 生成器 (Generator)
开发语言·python