Rumah >pembangunan bahagian belakang >Golang >Bagaimana Menguruskan Pelepasan Sumber dengan Betul dengan `menunda` dalam Gelung Apabila Menyoal Pangkalan Data?

Bagaimana Menguruskan Pelepasan Sumber dengan Betul dengan `menunda` dalam Gelung Apabila Menyoal Pangkalan Data?

Linda Hamilton
Linda Hamiltonasal
2024-12-26 06:59:13845semak imbas

How to Properly Manage Resource Release with `defer` in Loops When Querying Databases?

Keluaran Sumber yang Betul dengan penangguhan dalam Gelung

Menyiasat Pangkalan Data Di Dalam Gelung

Dalam gelung di mana anda perlu membuat pertanyaan SQL ke pangkalan data, anda boleh menstrukturkan kod anda sebagai berikut:

for rows.Next() {
   fields, err := db.Query(.....)
   if err != nil {
      // ...
   }
   defer fields.Close()

   // do something with `fields`

}

Walau bagaimanapun, terdapat cara yang berbeza untuk mengendalikan pelepasan sumber menggunakan penangguhan dalam senario sedemikian.

Memindahkan penangguhan di Luar Gelung

Satu pilihan adalah untuk mengalihkan pernyataan penangguhan di luar gelung, seperti yang dilihat di bawah:

for rows.Next() {
   fields, err := db.Query(.....)
   if err != nil {
      // ...
   }

   // do something with `fields`
}

defer fields.Close()

Menggunakan Fungsi Tanpa Nama

Pendekatan lain ialah membungkus kod peruntukan sumber dalam fungsi tanpa nama dan meletakkan pernyataan penangguhan dalam fungsi itu:

for rows.Next() {
    func() {
        fields, err := db.Query(...)
        if err != nil {
            // Handle error and return
            return
        }
        defer fields.Close()

        // do something with `fields`
    }()
}

Ralat Pengendalian dalam Nama Fungsi

Anda juga boleh mencipta fungsi bernama untuk mengendalikan pelaporan ralat:

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
    }
}

Mengendalikan Baris.Close() Ralat

Memandangkan Rows.Close() mengembalikan ralat, anda mungkin mahu menyemaknya. Ini boleh dilakukan menggunakan fungsi tanpa nama:

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
}

Kesimpulan

Pendekatan yang betul untuk melepaskan sumber dengan penangguhan dalam gelung bergantung pada keperluan khusus anda dan pengendalian ralat keperluan. Dengan mempertimbangkan dengan teliti pilihan yang dibentangkan di atas, anda boleh memastikan pengurusan sumber yang betul dan mengelakkan kebocoran sumber.

Atas ialah kandungan terperinci Bagaimana Menguruskan Pelepasan Sumber dengan Betul dengan `menunda` dalam Gelung Apabila Menyoal Pangkalan Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn