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