跳到主要内容

Go 语言中 defer 语句

· 阅读需 1 分钟
素明诚
Full stack development

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 后面如果是匿名函数,这个匿名函数设计到的变量,是在执行的时候才会计算。