defer确保在函数结束前执行
package main
import (
"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 fib
func Fibonacci() func() int {
a, b := 0, 1
return func() int {
a, b = b, a+b
return a
}
}
package main
import (
"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