首頁 > 後端開發 > 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?

循環中延遲的正確資源釋放

循環內查詢資料庫

InInInInIn需要對資料庫進行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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板