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

相关推荐
代码丰11 小时前
java 21虚拟线程vs传统线程 原理分析以及具体测试例子去分析性能提升
后端
用户05343693807311 小时前
langchainrust:Rust 版 LangChain 框架(LLM+Agent+RAG)
后端
Cyber4K11 小时前
【Python专项】基础语法(2)
开发语言·python
某人辛木11 小时前
JDK安装配置
java·开发语言
fox_lht11 小时前
第十章 通用集合
开发语言·后端·算法·rust
小王师傅6611 小时前
【Java结构化梳理】泛型-初步了解-下
java·开发语言
悟空聊架构12 小时前
GStack的26种专家角色,真正实现一人成军!
后端
counting money12 小时前
Spring框架基础(依赖注入-半注解形式)
java·后端·spring
SmartRadio12 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信 (采用Arduino代码框架)
开发语言·智能手机·esp32·长距离wifi