defer延迟调用:
1、确保调用在函数结束时发生;
2、defer列表为先进后出;
3、通常在Open/Close Lock/Unlock中使用。
defer调用顺序示例:
package main import ( "fmt" ) func deferType() { defer fmt.Println("defer 01") defer fmt.Println("defer 02") fmt.Println("hello defer") defer fmt.Println("defer 03") panic("hello panic") defer fmt.Println("defer 04") // panic后的defer不会被执行 } func main() { deferType() } 输出结果: hello defer panic: hello panic defer 03 defer 02 defer 01 goroutine 1 [running]: main.deferType() /Users/shongbing/go/src/imooc/errhanding/defer/defer.go:15 +0x19b main.main() /Users/shongbing/go/src/imooc/errhanding/defer/defer.go:35 +0x22
defer 关闭文件
package main import ( "os" "bufio" "fmt" ) func Fibonacci() func() int { // 斐波那契数列,返回一个intGen类型 a, b := 0, 1 return func() int { a, b = b, a + b return a } } func writeFile(filename string) { file, err := os.Create(filename) if err != nil { panic(err) } defer file.Close() writer := bufio.NewWriter(file) defer writer.Flush() f := Fibonacci() for i:=0; i<20; i++ { fmt.Fprintln(writer, f()) } } func main() { writeFile("fib.txt") }