循環中延遲的正確資源釋放
循環內查詢資料庫
InInInInIn需要對資料庫進行SQL查詢的循環,您可以將程式碼建構成如下所示:for rows.Next() { fields, err := db.Query(.....) if err != nil { // ... } defer fields.Close() // do something with `fields` }
將 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中文網其他相關文章!