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

相关推荐
进击的_鹏7 分钟前
【C++11】initializer_list列表初始化、右值引用和移动语义、可变参数模版等
开发语言·c++
mark-puls13 分钟前
C语言打印爱心
c语言·开发语言·算法
AAA修煤气灶刘哥13 分钟前
Kafka 入门不踩坑!从概念到搭环境,后端 er 看完就能用
大数据·后端·kafka
月小水长15 分钟前
大模型接入自定义 MCP Server,我开发了个免费使用的基金涨跌归纳和归因分析的 Agent
人工智能·后端
yinke小琪17 分钟前
说说hashCode() 和 equals() 之间的关系
java·后端·面试
西阳未落21 分钟前
C语言柔性数组详解与应用
c语言·开发语言·柔性数组
Huhbbjs21 分钟前
SQL 核心概念与实践总结
开发语言·数据库·sql
咕噜咕噜啦啦34 分钟前
Qt之快捷键、事件处理、自定义按键——完成记事本项目
开发语言·qt
花果山最Man的男人35 分钟前
@Autowired注解使用说明
后端