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 小时前
基于SpringBoot的送货上门系统【2026最新】
java·vue.js·spring boot·后端·mysql·spring·tomcat
码农水水3 小时前
国家电网Java面试被问:二叉树的前序、中序、后序遍历
java·开发语言·面试
Respect@3 小时前
qml之TableViewColumn
开发语言·qml
不吃橘子的橘猫3 小时前
NVIDIA DLI 《Build a Deep Research Agent》学习笔记
开发语言·数据库·笔记·python·学习·算法·ai
算法与双吉汉堡3 小时前
【短链接项目笔记】6 短链接跳转
java·开发语言·笔记·后端·springboot
飞浪3 小时前
告别“Hello World”:一个有经验的程序员如何用 FastAPI 打造生产级后端模板
后端
学Linux的语莫3 小时前
python的基础使用
开发语言·python
独自破碎E3 小时前
IDEA2023中新建Spring Boot2.X版本的工程的方法
java·spring boot·后端
wildlily84274 小时前
C++ Primer 第5版章节题 第十章
开发语言·c++
无限大64 小时前
为什么"微服务"架构流行?——从集中式到分布式
后端