Skip to content

defer

go
f, err := os.Open("a.txt")
if err != nil {
	return err
}
defer f.Close()

不管你中间 return 几次

不管是否发生 panic

Close() 一定会执行

“立刻求值”

defer 会记录函数的实参

例 1:

go
i := 0
defer fmt.Println(i)
i++

defer 会立刻记录 0 ,即便后面 i 发生了变化,当 defer 记录的函数执行的时候,会使用先前记录的 0

例 2:

go
f, _ := os.Open("a.txt")
defer f.Close()

这里例子中,f.Close 没有参数,所以没有影响

后进先出

defer 是后进先出(LIFO)

go
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)

输出

3
2
1