Go 语言中 defer 语句
· 阅读需 1 分钟
Go 语言中,defer
语句遵循后进先出(LIFO)的原则执行。这样做主要是为了简化资源(如文件、锁)的管理,使得资源的获取和释放顺序保持一致,易于维护。
package main
import (
"fmt"
)
func main() {
defer fmt.Println("第一个 defer") // 最后执行
defer fmt.Println("第二个 defer") // 第二个执行
defer fmt.Println("第三个 defer") // 最先执行
fmt.Println("主体")
}
本质原因就是因为 defer
语句使用了栈来存储
defer 与 匿名函数
使用 defer
匿名函数时,核心问题在于变量捕获特性
package main
import "fmt"
func main() {
a := 1
defer func() {
fmt.Println(a) // 输出 2
}()
a = 2
fmt.Println(a) // 输出 2
}
defer
后面如果是 go 语句,这个 go 语句里面的变量,在注册的时候就已经计算好了
defer
后面如果是匿名函数,这个匿名函数设计到的变量,是在执行的时候才会计算。