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

相关推荐
陈随易19 分钟前
VSCode古法神器fnMap v9开发故事
前端·后端·程序员
用户298698530141 小时前
Java 实现 Word 文档文本查找与高亮标注
java·后端
雪隐2 小时前
个人电脑玩AI-06让5060 Ti给你打工——Qwen3.6-35B-A3B + LM Studio + openWebUI
人工智能·后端
卷无止境2 小时前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
Ausra无忧2 小时前
记录在公司把单服务器升级成多服务器架构流程
前端·后端·架构
XiaoYuanCode2 小时前
Spring Cloud Alibaba实战01|Nacos入门服务注册与配置中心
后端
宇宙之一粟2 小时前
乐企版式文件生成平台
java·后端·python
java小白小3 小时前
SpringBoot(11):Spring Security 入门——让你的项目加上登录墙
后端
一只公羊3 小时前
在 Ubuntu 26.04 宿主机上利用 Docker 构建低版本 glibc 兼容编译环境
后端
玉宇夕落3 小时前
别被AI骗了!深度拆解 LLM Tool Use 背后的“缸中大脑”与代码真相
后端