Go defer+闭包的一个小坑

Go defer+闭包的一个小坑

今天在写代码的时候,发现一个奇怪的事情,在将无效的逻辑简化之后,可以总结出这样的一段代码:

1
2
3
4
5
6
7
func main() {
a := "1"
defer fmt.Println("defer only: " + a)
defer func() { fmt.Println("defer closure: " + a) }()

a = "2"
}

先让我们想一想,这段代码的输出是什么?我的之前的理解中,显然,这是问 defer 的执行顺序问题,那太简单了,毫无疑问应该输出:

1
2
defer closure: 1
defer only: 1

然而,真的执行这段代码之后,我惊讶的发现,真实的输出是:

1
2
defer closure: 2
defer only: 1

这就有些让我费解了,正好借着这个机会,我对 defer& 闭包做了一次系统的整理。

defer

预计算

Go 官方文档对此由如下阐述

to be finished


Go defer+闭包的一个小坑
https://hyphennn.com/2024/06/07/go-defer-closure/
Author
hyphennn
Posted on
June 7, 2024
Licensed under