首页 > 编程笔记

Go语言defer语句的用法

在进行 I/O 操作时,如果遇到错误,需要提前返回,而返回之前应该关闭相应的资源,否则容易造成资源泄露等问题,这时就需要使用 defer 语句来解决这些问题。

使用 defer 语句打开资源,不仅减少了代码的书写量,而且使程序变得更加简洁,例如:
func ReadWrite() bool{
   file.Open("file")
   defer file.Close()  //打开和关闭写在一块,方便管理
   if aFailure {
       return false
   } else if bFailure {
       return false
   }
   return false
}
在 defer 后指定的函数会在函数退出前调用。如果多次调用 defer,那么 defer 采用后进先出的模式,例如:
package main
import (
  "fmt"
)
func main() {
   for i := 0; i < 5; i++ {
       defer fmt.Printf("%d\n", i)
   }
}
运行结果为:

4
3
2
1
0

defer 的使用可以总结为以下几点:

多个defer的执行顺序

多个 defer 语句的执行顺序为“逆序”,defer、return、返回值三者的执行逻辑如下:
也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。

例如:
package main
import (
    "fmt"
)
func main() {
    fmt.Println("defer begin")
    //将defer放入延迟调用栈
    defer fmt.Println(0)
    defer fmt.Println(1)
    //最后一个放入, 位于栈顶, 最先调用
    defer fmt.Println(2)
    fmt.Println("defer end")
}
运行结果为:

defer begin
defer end
2
1
0

从以上代码中可以看出:

推荐阅读