defer确保在函数结束前执行
package mainimport ( "bufio" "fmt" "godemo/fib" "os")func tryDerer() { //defer是个栈遵循先进后出在函数rerun之前执行, defer fmt.Println(1) defer fmt.Println(2) fmt.Println(3) return //输出3,2,1 fmt.Println(4)}
参数在defer语句时计算
func tryDerer() { for i:=0;i<35;i++ { defer fmt.Println(i) //先进后出从30开始 if i==30 { panic("fefsffedfsdfsdf") } }}
实战
package fibfunc Fibonacci() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return a }}
package mainimport ( "bufio" "fmt" "godemo/fib" "os")func writeFile(filename string) { file, err := os.Create(filename) if err != nil { panic(err) } defer file.Close() //文件写完在关闭 writer := bufio.NewWriter(file) //bufio包装写到内存里 defer writer.Flush() //写到文件里 f:=fib.Fibonacci() for i := 0; i < 20; i++ { fmt.Fprintln(writer,f()) }}func main() { //资源管理和出错处理 writeFile("fib.txt")}
何时使用defer调用
- open/close
- lock/unlock
- printheader/printfooter