ループ内の遅延による適切なリソース解放
ループ内でのデータベースのクエリ
データベースに対して SQL クエリを実行する必要があるループでは、コードを次のように構成できます。
for rows.Next() { fields, err := db.Query(.....) if err != nil { // ... } defer fields.Close() // do something with `fields` }
ただし、このようなシナリオでは遅延を使用してリソースの解放を処理するさまざまな方法があります。
遅延をループ外に移動する
1 つのオプションは、次のように 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` }() }
名前付きのエラー処理Function
エラー報告を処理する名前付き関数を作成することもできます:
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 } }
Handling Rows.Close() Error
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」を使用してリソースの解放を適切に管理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。