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

相关推荐
likuolei几秒前
XML 元素 vs. 属性
xml·java·开发语言
X***48964 分钟前
C源代码生成器
c语言·开发语言
自不量力的A同学9 分钟前
Spring Boot 4.0.0 正式发布
java·spring boot·后端
梁正雄10 分钟前
2、Python流程控制
开发语言·python
d***292417 分钟前
【spring】Spring事件监听器ApplicationListener的使用与源码分析
java·后端·spring
catchadmin35 分钟前
PHP True Async RFC 被拒——原生异步离 PHP 还有多远?
开发语言·php
J***793936 分钟前
PHP在电商中的Magento
开发语言·php
v***5651 小时前
Spring Cloud Gateway 整合Spring Security
java·后端·spring
python零基础入门小白1 小时前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
码事漫谈1 小时前
C++中不同类型的默认转换详解
后端