Rumah  >  Artikel  >  pembangunan bahagian belakang  >  go - hanya bersihkan sumber apabila fungsi akan mengembalikan ralat

go - hanya bersihkan sumber apabila fungsi akan mengembalikan ralat

WBOY
WBOYke hadapan
2024-02-09 11:48:19959semak imbas

go - 仅在函数即将返回错误时清理资源

Editor PHP Baicao memperkenalkan anda kepada teknologi untuk membersihkan sumber apabila fungsi akan mengembalikan ralat - "pergi". Teknologi ini boleh membantu pembangun mengendalikan kerja pembersihan sumber dengan lebih elegan semasa menulis kod. Dengan menggunakan "go", pembangun boleh meletakkan logik pembersihan sumber dalam fungsi berasingan melalui pernyataan tangguh sebelum fungsi mengembalikan ralat, dengan itu mengelakkan lebihan dalam kod dan pengendalian ralat yang menyusahkan. Kesederhanaan dan kecekapan teknologi "go" menjadikannya pilihan pertama bagi banyak pembangun PHP. Mari kita lihat prinsip pelaksanaan dan kaedah penggunaannya!

Kandungan soalan

Andaikan saya mempunyai fungsi yang mula-mula mencipta direktori dan kemudian melakukan beberapa lagi operasi seperti ini:

{
    err := os.Mkdir(path, os.ModePerm)
    ...

    err = doSomething()
    if err != nil {
        return nil, err
    }

    err = doSomethingElse()
    if err != nil {
        return nil, err
    }

    return path, nil
}

Sekarang saya mahu fungsi memadamkan direktori yang dicipta dalam semua kes apabila ralat berlaku. Apakah cara yang paling bersih?

Salah satu cara adalah dengan memasukkan setiap if 分支中调用 os.removeall ,但这不是一个很好的解决方案。另一种方法是使用 defer pernyataan tetapi juga laksanakan sekiranya tiada kesilapan.

Penyelesaian

Ya, fungsi kelewatan akan sentiasa dilaksanakan, tetapi sama ada ia memadamkan direktori atau tidak terpulang kepada anda sepenuhnya.

Gunakan fungsi kelewatan dan semak ralat. Jika tiada ralat, jangan padam direktori. Untuk melakukan ini, gunakan parameter hasil yang dinamakan, contohnya:

func foo() (result resulttype, err error) {
    path := "some folder"

    defer func() {
        if err != nil { // this is the result err
            if err2 := os.removeall(path); err2 != nil {
                // handle err2
            }
        }
    }()

    err := os.mkdir(path, os.modeperm)
    
    ...
}

Sila ambil perhatian bahawa jika terdapat pernyataan return yang jelas, contohnya:

return path, errors.New("bar")

Pernyataan return 语句首先将值分配给 resulterr di atas mula-mula memberikan nilai kepada hasil dan err, jadi dalam fungsi tertunda anda boleh mendapatkan/melihat nilai ini.

Lihat kandungan berkaitan: Bagaimana untuk mengembalikan nilai dalam fungsi go yang panik?

Atas ialah kandungan terperinci go - hanya bersihkan sumber apabila fungsi akan mengembalikan ralat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam