Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menguruskan Keluaran Sumber dengan `menangguhkan` dalam Go Loops?

Bagaimana untuk Menguruskan Keluaran Sumber dengan `menangguhkan` dalam Go Loops?

Linda Hamilton
Linda Hamiltonasal
2024-12-22 18:58:10767semak imbas

How to Properly Manage Resource Release with `defer` in Go Loops?

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!

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