5.2 defer

尽管go语言提供了垃圾回收器,但是有些资源需要我们明确的去释放。例如,当我们处理完一个文件事,需要使用Close()关闭文件。这类代码总是危险的。首先,当我们写一个函数时,很容易忘记关闭在第十行声明的某些东西。另外,一个函数可能会有多个返回点。go的解决方法会是提供了defer关键字:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. file, err := os.Open("a_file_to_read")
  8. if err != nil {
  9. fmt.Println(err)
  10. return
  11. }
  12. defer file.Close()
  13. // 读这个文件
  14. }

如果你试着运行上面的代码,你可能会得到一个错误(因为文件不存在)。关键在于展示defer是如何工作。无论如何你的defer都会在方法返回时得到执行,虽然这有点极端。但是这可以帮你在初始化的附近释放资源,并且可以实现多个返回点。

链接