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-11-15SendGrid 的 Go 客户端库怎么实现同时向多个邮箱发送邮件?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么设置header 和 标签tag 呢?-icode9专业技术文章分享
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼
- 2024-10-25Google Cloud动手实验详解:如何在Cloud Run上开发无服务器应用
- 2024-10-24AI ?先驱齐聚 BAAI 2024,发布大规模语言、多模态、具身、生物计算以及 FlagOpen 2.0 等 AI 模型创新成果。
- 2024-10-20goland工具下,如修改一个项目的标准库SDK的版本-icode9专业技术文章分享
- 2024-10-17Go学习:初学者的简单教程
- 2024-10-17Go学习:新手入门完全指南