defer在Go中用于延迟执行函数,常用于资源管理;多个defer按后进先出顺序执行;参数在defer时求值,循环中需注意变量引用问题。

在Go语言中,defer 是一个非常实用的关键字,用于延迟执行某个函数调用,直到包含它的函数即将返回时才执行。它常被用来简化资源管理,比如关闭文件、释放锁或记录函数执行时间。正确使用 defer 能让代码更简洁、安全且不易出错。
defer 的基本语法与执行规则
defer 后面跟一个函数或方法调用,该调用会被推迟到当前函数 return 之前执行。
示例:
func main() { defer fmt.Println("world") fmt.Println("hello")}// 输出:// hello// world
多个 defer 语句会按照“后进先出”(LIFO)的顺序执行:
func main() { defer fmt.Println("1") defer fmt.Println("2") defer fmt.Println("3")}// 输出:// 3// 2// 1注意:defer 只推迟函数的执行时机,而参数的求值是在 defer 出现时立即完成的。
立即学习“go语言免费学习笔记(深入)”;
func main() { i := 0 defer fmt.Println(i) // 输出 0,因为 i 的值此时已确定 i++ return}常见使用场景与技巧
1. 文件操作中的自动关闭
打开文件后,通常需要确保在函数退出前关闭文件。使用 defer 可避免遗漏。func readFile(filename string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close() // 确保函数结束前关闭// 读取文件内容...scanner := bufio.NewScanner(file)for scanner.Scan() { fmt.Println(scanner.Text())}return scanner.Err()}
2. 互斥锁的自动释放
在并发编程中,使用 defer 可以防止忘记解锁导致死锁。var mu sync.Mutexvar balance intfunc Deposit(amount int) {mu.Lock()defer mu.Unlock()balance += amount}
即使函数中有多处 return 或发生 panic,锁也能被正确释放。
Type
生成草稿,转换文本,获得写作帮助-等等。
83 查看详情
![]()
3. 记录函数执行时间
结合匿名函数和 defer,可以方便地测量函数运行时间。func doSomething() { start := time.Now() defer func() { fmt.Printf("doSomething 执行耗时: %v\n", time.Since(start)) }()// 模拟耗时操作time.Sleep(2 * time.Second)}
4. 错误处理的增强(通过 defer 修改返回值)
如果函数有命名返回值,defer 可以修改它们。func divide(a, b float64) (result float64, err error) { defer func() { if b == 0 { result = 0 err = fmt.Errorf("除数不能为零") } }()result = a / breturn}
注意:这种做法需谨慎使用,逻辑应清晰,避免造成误解。
需要注意的陷阱与最佳实践
1. defer 中的循环变量问题
在循环中使用 defer 时,要注意闭包捕获的是变量的引用。for i := 0; i < 3; i++ { defer fmt.Println(i) // 全部输出 3}解决方法:传参或使用局部变量
for i := 0; i < 3; i++ { defer func(i int) { fmt.Println(i) }(i)}// 输出:2, 1, 0(LIFO)2. defer 函数的性能考虑
defer 有一定开销,但在大多数场景下可忽略。对于极高频调用的函数,可评估是否内联执行。3. panic 和 recover 中的 defer
只有在同一个 goroutine 中,defer 才能捕获 panic。func mayPanic() { defer func() { if r := recover(); r != nil { fmt.Println("recover:", r) } }() panic("oops")}recover 必须在 defer 函数中直接调用才有效。
基本上就这些。defer 是 Go 中优雅处理清理逻辑的核心机制,掌握其行为特点和常见模式,能让代码更健壮、易读。合理使用,避免滥用,是写出高质量 Go 代码的关键之一。
以上就是如何在Golang中使用defer关键字_Golangdefer使用技巧与示例详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1028106.html
微信扫一扫
支付宝扫一扫