首页 > 编程笔记 > Go语言笔记 阅读:111

Go语言defer语句的用法

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

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

4
3
2
1
0

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

多个defer的执行顺序

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

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

defer begin
defer end
2
1
0

从以上代码中可以看出:

相关文章