首页 > 后端开发 > Golang > 查询数据库时如何通过循环中的'defer”正确管理资源释放?

查询数据库时如何通过循环中的'defer”正确管理资源释放?

Linda Hamilton
发布: 2024-12-26 06:59:13
原创
837 人浏览过

How to Properly Manage Resource Release with `defer` in Loops When Querying Databases?

循环中延迟的正确资源释放

在循环内查询数据库

In一个需要对数据库进行 SQL 查询的循环,您可以将代码构造为如下所示:

for rows.Next() {
   fields, err := db.Query(.....)
   if err != nil {
      // ...
   }
   defer fields.Close()

   // do something with `fields`

}
登录后复制

但是,在这种情况下,有不同的方法可以使用 defer 来处理资源释放。

将 defer 移到循环之外

一种选择是将 defer 语句移到循环之外,如下所示下面:

for rows.Next() {
   fields, err := db.Query(.....)
   if err != nil {
      // ...
   }

   // do something with `fields`
}

defer fields.Close()
登录后复制

利用匿名函数

另一种方法是将资源分配代码包装在匿名函数中,并将 defer 语句放置在该函数中:

for rows.Next() {
    func() {
        fields, err := db.Query(...)
        if err != nil {
            // Handle error and return
            return
        }
        defer fields.Close()

        // do something with `fields`
    }()
}
登录后复制

命名中的错误处理函数

您还可以创建一个命名函数来处理错误报告:

func foo(rs *db.Rows) error {
    fields, err := db.Query(...)
    if err != nil {
        return fmt.Errorf("db.Query error: %w", err)
    }
    defer fields.Close()

    // do something with `fields`
    return nil
}

for rows.Next() {
    if err := foo(rs); err != nil {
        // Handle error and return
        return
    }
}
登录后复制

处理 Rows.Close() 错误

由于 Rows.Close() 返回错误,您可能需要检查它。这可以使用匿名函数来完成:

func foo(rs *db.Rows) (err error) {
    fields, err := db.Query(...)
    if err != nil {
        return fmt.Errorf("db.Query error: %w", err)
    }
    defer func() {
        if err = fields.Close(); err != nil {
            err = fmt.Errorf("Rows.Close() error: %w", err)
        }
    }()

    // do something with `fields`
    return nil
}
登录后复制

结论

在循环中使用 defer 释放资源的正确方法取决于您的具体需求和错误处理要求。通过仔细考虑上述选项,您可以确保正确的资源管理并防止资源泄漏。

以上是查询数据库时如何通过循环中的'defer”正确管理资源释放?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板