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

相关推荐
njsgcs2 分钟前
python getattr调用当前文件引用的模块内的方法,实例
开发语言·python
Asthenia04128 分钟前
Spring事件机制:微服务架构下的子服务内部解耦合/多场景代码分析
后端
lly2024069 分钟前
R 列表:深入解析及其在数据分析中的应用
开发语言
du fei20 分钟前
C# 与 相机连接
开发语言·数码相机·c#
独好紫罗兰20 分钟前
洛谷题单3-P2669 [NOIP 2015 普及组] 金币-python-流程图重构
开发语言·python·算法
1zero1021 分钟前
[C语言笔记]09、指针
c语言·开发语言·笔记
Asthenia041221 分钟前
面试官问我:Spring AOP的代理模式与实现原理深度剖析
后端
青橘MATLAB学习26 分钟前
钢管下料问题:基于Matlab的优化求解与实践
开发语言·数学建模·matlab·钢管下料
小马爱打代码34 分钟前
Spring Boot - 实现邮件发送
spring boot·后端
褚翾澜36 分钟前
Ruby语言的代码重构
开发语言·后端·golang