Go Defer

Defer 用来保证一个函数调用会在程序执行的最后被调用。通常用于资源清理工作。

  1. package main
  2. import "fmt"
  3. import "os"
  4. // 假设我们想创建一个文件,然后写入数据,最后关闭文件
  5. func main() {
  6. // 在使用createFile得到一个文件对象之后,我们使用defer
  7. // 来调用关闭文件的方法closeFile,这个方法将在main函数
  8. // 最后被执行,也就是writeFile完成之后
  9. f := createFile("/tmp/defer.txt")
  10. // Windows下面使用这个语句
  11. // f := createFile("D:\\Temp\\defer.txt")
  12. defer closeFile(f)
  13. writeFile(f)
  14. }
  15. func createFile(p string) *os.File {
  16. fmt.Println("creating")
  17. f, err := os.Create(p)
  18. if err != nil {
  19. panic(err)
  20. }
  21. return f
  22. }
  23. func writeFile(f *os.File) {
  24. fmt.Println("writing")
  25. fmt.Fprintln(f, "data")
  26. }
  27. func closeFile(f *os.File) {
  28. fmt.Println("closing")
  29. f.Close()
  30. }

运行结果

  1. creating
  2. writing
  3. closing

使用defer来调用closeFile函数可以保证在main函数结束之前,关闭文件的操作一定会被执行。