循环中延迟的正确资源释放
在循环内查询数据库
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中文网其他相关文章!