在 Go 语言中的 defer 关键字就是 Go 语言中延迟语句的标志。Go 语言会在函数 即将返回时 按 逆序 执行 defer 后的语句。也就是说先被 defer 的语句后执行,最先执行最后被 defer 的语句。 defer 和有些语言中的 finally 语句块的用法类似,一般都用于释放一些资源,最常用的地方就是进程锁的释放。
Tips :关于 defer 的进程锁的释放在 Go 语言的多线程中会有介绍。
1. defer 的逆序执行
defer 会在函数即将结束的时候执行,而且是按照 defer 的顺序 逆序 执行。
代码示例 :
package main
import "fmt"
func main() {
defer fmt.Println("第一个defer的语句")
defer fmt.Println("第二个defer的语句")
defer fmt.Println("第三个defer的语句")
fmt.Println("Hello Codey!")
}
- 第 6 行:第一个 defer 的语句,最后一个执行;
- 第 7 行:第二个 defer 的语句,第二个执行;
- 第 8 行:第一个 defer 的语句,最后一个执行。
执行结果 :
2. defer 中的变量
defer 关键字之后若有变量,则 defer 记录的是在 defer 时的变量值 ,而不是最后函数结束时的变量值。
代码示例 :
package main
import "fmt"
func main() {
a := 10
defer fmt.Println("defer时a的值为", a)
a = 100
fmt.Println("print时a的值为", a)
}
- 第 7 行:此时变量 a 的值为 10,所以 defer 输出时a的值为10;
- 第 8 行:此时变量 a 的值为 100,所以输出时 a 的值为100。
执行结果 :
3. 小结
本文主要介绍了 Go 语言中 defer 的使用,需要注意以下几点:
- defer 是 先声明后执行 的语句模式;
- defer 会在函数 即将结束 的时候统一执行;
- defer 中的变量值 不会 被 defer 之后的语句改变。
本文来自互联网用户投稿,不拥有所有权,该文观点仅代表作者本人,不代表本站立场。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。