ホームページ > バックエンド開発 > 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?

ループ内の遅延による適切なリソース解放

ループ内でのデータベースのクエリ

データベースに対して 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート