defer相当于一个栈
参数在defer语句时计算
for i := 0; i < 100; i++ {
defer fmt.Println(i)
if i == 30 {
// Uncomment panic to see
// how it works with defer
// panic("printed too many")
}
}
//结果 30 29 28 27
defer确保在调用函数结束时发生
fmt.Println(1)
fmt.Println(2)
//结果 1 2
defer fmt.Println(1)
fmt.Println(2)
//结果 2 1
defer fmt.Println(1)
defer fmt.Println(2)
fmt.Println(3)
//结果 3 2 1
示例
func writeFile(filename string) {
file, err := os.createFile(filename)
if err != nil {
painc(err)
}
defer file.Close() //关闭文件
writer := bufio.NewWriter(file)
defer writer.Flush() //缓存导出文件
for i := 0; i < 20; i++ {
fmt.Fprintln(writer, i)
}
}
何时defer
- Open/Close
- Lock/Unlock
- PrintHeader/PrintFooter