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

相关推荐
叫我:松哥5 分钟前
基于Flask开发的智能招聘平台,集成了AI匹配引擎、数据预测分析和可视化展示功能
人工智能·后端·python·信息可视化·自然语言处理·flask·推荐算法
IT_陈寒5 分钟前
Java开发者必知的5个性能优化技巧,让应用速度提升300%!
前端·人工智能·后端
牧小七9 分钟前
springboot配置maven激活配置文件
spring boot·后端·maven
nbsaas-boot10 分钟前
Go 语言中的集合体系:从语言设计到工程实践
开发语言·后端·golang
李日灐11 分钟前
C++STL:deque、priority_queue详解!!:详解原理和底层
开发语言·数据结构·c++·后端·stl
阿坤带你走近大数据11 分钟前
JavaScript脚本语言的简单介绍
开发语言·javascript·ecmascript
yangminlei11 分钟前
Spring Boot 实现 DOCX 转 PDF
开发语言·spring boot·python
悟道|养家12 分钟前
基于L1/L2 缓存访问速度的角度思考数组和链表的数据结构设计以及工程实践方案选择(2)
java·开发语言·缓存
wjs202412 分钟前
堆的基本存储
开发语言
虫小宝13 分钟前
微信群发消息API接口对接中Java后端的请求参数校验与异常反馈优化技巧
android·java·开发语言