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

相关推荐
炸薯条!12 小时前
从零开始学C++(4) --类和对象
开发语言·c++·算法
渡我白衣12 小时前
打印宏与socket模块设计
java·linux·开发语言·c++·ide·人工智能·eclipse
ayqy贾杰12 小时前
Claude Fable 5 提示词泄漏,抓紧学习下
前端·后端·面试
Wang's Blog13 小时前
Go-Zero框架上手前奏2: 微服务核心要素 —— 拆分、通信与无状态设计
开发语言·微服务·golang
智码看视界13 小时前
Day18 SpringBoot自动配置原理:从@SpringBootApplication开始
java·spring boot·后端·自动装配
程序员爱钓鱼13 小时前
Rust 常量与静态变量详解:const 与 static 的区别
后端
我是坏垠1 天前
Crypto、Cipher与Password:Java加密开发的三个核心概念
java·开发语言·python
white_ant1 天前
JDK LTS 版本升级迁移注意事项大全
java·开发语言
Bobolink_1 天前
跨境业务网络环境评估,“干净、一致、独享”三个关键指标
开发语言·网络·php·跨境网络·网络环境