概念
函数中的defer语句置于最后执行,而同一个函数中的多个defer语句,先声明后执行
示例
package main
import (
"fmt"
)
func main() {
fmt.Println("defer begin")
// 将defer放入延迟调用栈
defer fmt.Println(1)
defer fmt.Println(2)
// 最后一个放入, 位于栈顶, 最先调用
defer fmt.Println(3)
fmt.Println("defer end")
}
输出结果:
defer begin
defer end
3
2
1
用途
读写文件,如果不close,进程就一直无法释放文件资源
不用defer的处理:
func fileSize(filename string) int64 {
f, err := os.Open(filename)
if err != nil {
return 0
}
info, err := f.Stat()
if err != nil {
f.Close()
return 0
}
size := info.Size()
f.Close()
return size
}
很明显,如果重复f.close()
defer优化:
func fileSize(filename string) int64 {
f, err := os.Open(filename)
if err != nil {
return 0
}
defer f.close() // 每当函数return后,就出发f.close
info, err := f.Stat()
if err != nil {
return 0
}
size := info.Size()
return size
}