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

相关推荐
孙浩君9 分钟前
0行手写代码,我用AI做了一个打工人模拟器(含3D霓虹城市漫游)
前端·后端
羑悻10 分钟前
超越Bridge:全面掌握Docker网络隔离与通信的底层逻辑!
后端
他日若遂凌云志12 分钟前
深入剖析 ET8 框架的 ETTask 机制:await 的挂起、唤醒、异常与零 GC
后端
星轨zb15 分钟前
[支付专题4]支付回调幂等性和状态:状态机与终态检查的边界
后端·支付架构学习
会编程的吕洞宾16 分钟前
Spring AI 2.0 结构化输出实战:让大模型返回精准 JSON 不再“抽风“,准确率从 78% 拉到 99%
java·后端
用户2986985301427 分钟前
Python 实现 Word 与 TIFF 双向转换的方案
后端·python·api
cpp_w35 分钟前
C#基础3- 面向对象中级应用3
后端·c#
weixin_3077791336 分钟前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
鸽鸽程序猿36 分钟前
【项目】【在线判题系统】c端:竞赛报名
c语言·开发语言
代码小学僧37 分钟前
如何低成本部署网站?Vercel 和 Cloudflare 怎么选?
前端·后端·serverless