首页 > 后端开发 > Golang > 正文

Golang如何使用defer延迟调用_Golang defer使用与示例

P粉602998670
发布: 2025-11-17 18:22:02
原创
297人浏览过
defer关键字用于延迟函数执行,确保在函数返回前调用,常用于资源释放;多个defer按后进先出顺序执行;参数在defer语句执行时确定,适用于文件关闭、锁释放和panic恢复。

golang如何使用defer延迟调用_golang defer使用与示例

在Go语言中,defer 是一个非常实用的关键字,用于延迟函数调用的执行。被 defer 修饰的函数调用会推迟到当前函数即将返回时才执行,无论函数是正常返回还是因 panic 而退出。这使得 defer 在资源释放、清理操作和错误处理中特别有用。

defer 的基本语法与执行时机

使用 defer 非常简单,只需在函数或方法调用前加上 defer 关键字:

func example() {
    defer fmt.Println("deferred call")
    fmt.Println("normal call")
}
// 输出:
// normal call
// deferred call

上面的例子中,尽管 defer 语句写在前面,但它会在函数结束时才执行。注意:defer 只延迟函数的执行,而参数的求值是在 defer 出现时立即完成的

func example2() {
    i := 10
    defer fmt.Println(i) // 输出 10,不是 20
    i = 20
    fmt.Println("i =", i)
}

多个 defer 的执行顺序

当一个函数中有多个 defer 语句时,它们会按照“后进先出”(LIFO)的顺序执行:

立即学习go语言免费学习笔记(深入)”;

func multipleDefer() {
    defer fmt.Println("first")
    defer fmt.Println("second")
    defer fmt.Println("third")
}
// 输出:
// third
// second
// first

这种特性非常适合成对的操作,比如加锁与解锁:

mu.Lock()
defer mu.Unlock()

即使后续代码发生 panic,Unlock 依然会被调用,避免死锁。

Zyro AI Background Remover
Zyro AI Background Remover

Zyro推出的AI图片背景移除工具

Zyro AI Background Remover 55
查看详情 Zyro AI Background Remover

defer 常见使用场景

1. 文件操作后的关闭
文件打开后应确保关闭,使用 defer 可以简洁地实现:

file, err := os.Open("data.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()
// 处理文件...

即便处理过程中出现异常或提前 return,Close 都会被调用。

2. 数据库连接或网络连接释放

conn, err := db.Connect()
if err != nil {
    panic(err)
}
defer conn.Close()

3. panic 恢复(recover)
结合 defer 和 recover,可以在发生 panic 时进行恢复并优雅处理:

func safeDivide(a, b int) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered:", r)
        }
    }()
    if b == 0 {
        panic("division by zero")
    }
    fmt.Println(a / b)
}

注意事项与常见误区

理解 defer 的行为细节有助于避免陷阱:

  • defer 的函数参数在 defer 语句执行时就确定了,不会动态变化
  • defer 不能跳过函数返回,它只是延迟执行
  • 在循环中使用 defer 需谨慎,可能造成性能问题或意外行为
  • 匿名函数 defer 中访问循环变量要注意闭包问题
for i := 0; i     defer func() {
        fmt.Println(i) // 输出三次 3
    }()
}

正确做法是传参:

defer func(idx int) {
    fmt.Println(idx)
}(i)

基本上就这些。defer 是 Go 中优雅处理清理逻辑的核心机制,掌握它的使用方式和原理,能写出更安全、清晰的代码。

以上就是Golang如何使用defer延迟调用_Golang defer使用与示例的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号