Go 语言函数中的defer

在 Go 语言中的 defer 关键字就是 Go 语言中延迟语句的标志。Go 语言会在函数即将返回时逆序执行 defer 后的语句。也就是说先被 defer 的语句后执行,最先执行最后被 defer 的语句。defer 和有些语言中的 finally 语句块的用法类似,一般都用于释放一些资源,最常用的地方就是进程锁的释放。

Tips:关于 defer 的进程锁的释放在 Go 语言的多线程中会有介绍。

 

1. defer 的逆序执行

defer 会在函数即将结束的时候执行,而且是按照 defer 的顺序逆序执行。

代码示例

代码块
  • package main
  • 2
  • import "fmt"
  • 4
  • func main() {
  • 6          defer fmt.Println("第一个defer的语句")
  • 7          defer fmt.Println("第二个defer的语句")
  • 8          defer fmt.Println("第三个defer的语句")
  • 9          fmt.Println("Hello Codey!")
  • 10  }
  • 第 6 行:第一个 defer 的语句,最后一个执行;
  • 第 7 行:第二个 defer 的语句,第二个执行;
  • 第 8 行:第一个 defer 的语句,最后一个执行。

执行结果

图片描述

 

2. defer 中的变量

defer 关键字之后若有变量,则 defer 记录的是在 defer 时的变量值,而不是最后函数结束时的变量值。

代码示例

代码块
  • package main
  • 2
  • import "fmt"
  • 4
  • func main() {
  • 6          a := 10
  • 7          defer fmt.Println("defer时a的值为", a)
  • 8          a = 100
  • 9          fmt.Println("print时a的值为", a)
  • 10  }
  • 第 7 行:此时变量 a 的值为 10,所以 defer 输出时a的值为10;
  • 第 8 行:此时变量 a 的值为 100,所以输出时 a 的值为100。

执行结果

图片描述

 

3. 小结

本文主要介绍了 Go 语言中 defer 的使用,需要注意以下几点:

  • defer 是先声明后执行的语句模式;
  • defer 会在函数即将结束的时候统一执行;
  • defer 中的变量值不会被 defer 之后的语句改变。

文章来源于网络,侵删!

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、云原生、Go、Python开发专业人才培训机构!