Rumah >pembangunan bahagian belakang >Golang >Bagaimana Menguruskan Pelepasan Sumber dengan Betul dengan `menunda` dalam Gelung Apabila Menyoal Pangkalan Data?
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!