Go 快速入门指南 - defer 函数
2022/12/28 4:24:05
本文主要是介绍Go 快速入门指南 - defer 函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
概述
一个 defer
语句就是一个普通的函数或方法调用。 defer
语句保证了不论是在正常情况下 (return 返回), 还是非正常情况下 (发生错误, 程序终止),函数或方法都能够执行。
主要特性
-
• 一个函数可定义多个
defer
语句 -
•
defer
表达式中的变量值在defer
表达式定义时已经确定 -
•
defer
表达式可以修改函数中的命名返回值
主要作用
-
• 简化异常处理 ( 使用
defer
+recover
),避免异常与控制流混合在一起 (try … catch … finally
) -
• 在
defer
做资源释放和配置重置等收尾工作
语法规则
如果 defer
函数只有一行语句,可以省略 func() { ... }
代码块,否则就需要用 func() { ... }
代码块包起来。
多个 defer 执行顺序
如果一个函数中注册了多个 defer
函数,这些函数会按照 后进先出
的顺序执行 (和 栈
的出栈顺序一致)。也就是最后注册的 defer 函数会第一个执行,而第一个注册的 defer
函数会最后执行。
例子
函数退出前打印字符
package main func A() { defer println("A 函数执行完成") println("A 函数开始执行") } func B() { defer println("B 函数执行完成") println("B 函数开始执行") } func main() { A() B() } // $ go run main.go // 输出如下 /** A 函数开始执行 A 函数执行完成 B 函数开始执行 B 函数执行完成 */
关闭文件句柄
package main import ( "fmt" "os" ) func createFile(name string) *os.File { file, err := os.Create(name) if err != nil { panic(err) } return file } func writeFile(file *os.File) { n, err := file.WriteString("hello world") if err != nil { panic(err) } else { fmt.Printf("成功写入 %d 个字符\n", n) } } func closeFile(file *os.File) { err := file.Close() if err != nil { panic(err) } } func main() { file := createFile("/tmp/defer_test.txt") defer closeFile(file) // 获取到文件句柄后,第一时间注册 defer 函数 writeFile(file) } // $ go run main.go // 输出如下 /** 成功写入 11 个字符 */ // $ cat /tmp/defer_test.txt // 输出如下 /** hello world */
多个 defer 函数
package main func A() { defer println("第 1 个 defer 函数") defer func() { // 这里为了演示 func() { ... } 的语法 defer println("第 2 个 defer 函数") }() defer println("第 3 个 defer 函数") println("A 函数开始执行") } func main() { A() } // $ go run main.go // 输出如下 /** A 函数开始执行 第 3 个 defer 函数 第 2 个 defer 函数 第 1 个 defer 函数 */
reference
-
- Go 圣经 (https://book.douban.com/subject/27044219)
这篇关于Go 快速入门指南 - defer 函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站