defer确保在函数结束前执行

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "godemo/fib"
  6. "os"
  7. )
  8. func tryDerer() {
  9. //defer是个栈遵循先进后出在函数rerun之前执行,
  10. defer fmt.Println(1)
  11. defer fmt.Println(2)
  12. fmt.Println(3)
  13. return //输出3,2,1
  14. fmt.Println(4)
  15. }

参数在defer语句时计算

  1. func tryDerer() {
  2. for i:=0;i<35;i++ {
  3. defer fmt.Println(i) //先进后出从30开始
  4. if i==30 {
  5. panic("fefsffedfsdfsdf")
  6. }
  7. }
  8. }

实战

  1. package fib
  2. func Fibonacci() func() int {
  3. a, b := 0, 1
  4. return func() int {
  5. a, b = b, a+b
  6. return a
  7. }
  8. }
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "godemo/fib"
  6. "os"
  7. )
  8. func writeFile(filename string) {
  9. file, err := os.Create(filename)
  10. if err != nil {
  11. panic(err)
  12. }
  13. defer file.Close() //文件写完在关闭
  14. writer := bufio.NewWriter(file) //bufio包装写到内存里
  15. defer writer.Flush() //写到文件里
  16. f:=fib.Fibonacci()
  17. for i := 0; i < 20; i++ {
  18. fmt.Fprintln(writer,f())
  19. }
  20. }
  21. func main() {
  22. //资源管理和出错处理
  23. writeFile("fib.txt")
  24. }

image.png

何时使用defer调用

  • open/close
  • lock/unlock
  • printheader/printfooter