Melepaskan Sumber dengan betul dengan penangguhan dalam Gelung
Dalam operasi pangkalan data, adalah penting untuk melepaskan sumber selepas digunakan untuk memastikan tiada memori atau sumber sistem bocor berlaku. Apabila menggunakan penyataan tangguh dalam gelung, adalah penting untuk memahami cara pelaksanaan fungsi tersebut dikendalikan.
Menurut spesifikasi Go, fungsi tertunda dilaksanakan apabila fungsi lampiran kembali atau panik. Oleh itu, jika sumber diperuntukkan dalam gelung dan penangguhan digunakan untuk melepaskannya, sumber hanya akan dikeluarkan selepas gelung selesai.
Untuk mengelakkan penangguhan pelepasan sumber tanpa perlu, adalah disyorkan untuk membalut peruntukan sumber dan kod keluaran dalam fungsi berasingan. Ini memastikan sumber dikeluarkan sebaik sahaja ia tidak diperlukan lagi, walaupun sekiranya berlaku panik:
for rows.Next() { func() { fields, err := db.Query(...) if err != nil { // Handle error and return return } defer fields.Close() // do something with `fields` }() }
Pendekatan ini memastikan sumber dikeluarkan dengan segera dan masih akan dikeluarkan walaupun gelung penutup menghadapi kesilapan atau panik. Ia juga mungkin untuk mengendalikan ralat dengan lebih anggun dengan mengembalikannya daripada fungsi tanpa nama:
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 }
Kemudian, anda boleh memanggil fungsi dari gelung dan menamatkannya pada ralat pertama:
for rows.Next() { if err := foo(rs); err != nil { // Handle error and return return } }
Selain itu, jika anda ingin menyemak ralat yang dikembalikan oleh Rows.Close(), anda boleh menggunakan anonymous lain fungsi:
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 }
Dengan mengikuti amalan terbaik ini, anda boleh memastikan keluaran sumber yang betul dalam gelung menggunakan penyataan tangguh, menghalang sebarang kemungkinan memori atau sumber kebocoran semasa mengendalikan ralat dengan berkesan.
Atas ialah kandungan terperinci Bagaimana untuk Menguruskan Keluaran Sumber dengan `menangguhkan` dalam Go Loops?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!