Rumah > pembangunan bahagian belakang > Golang > Bolehkah Fungsi Tertunda Mengembalikan Nilai dalam Go?

Bolehkah Fungsi Tertunda Mengembalikan Nilai dalam Go?

Linda Hamilton
Lepaskan: 2024-11-16 17:46:03
asal
864 orang telah melayarinya

Can Deferred Functions Return Values in Go?

Memulangkan Nilai daripada Fungsi Tertunda dalam Go

Dalam Go, fungsi penangguhan membolehkan anda melaksanakan blok kod selepas fungsi semasa mempunyai dikembalikan atau ditamatkan. Walaupun mungkin untuk mengubah suai parameter yang dikembalikan dalam fungsi penangguhan, ia tidak mungkin untuk mengembalikan set nilai baharu.

Pertimbangkan kod berikut:

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err // Attempt to return new values
        }
    }()
    panic("Report format not recognized.")
    // ...
}
Salin selepas log masuk

Dalam kod ini, penangguhan fungsi cuba mengembalikan sifar dan tersilap apabila panik berlaku. Walau bagaimanapun, ini tidak akan berfungsi kerana fungsi tangguh tidak dapat mengembalikan nilai. Sebaliknya, parameter yang dikembalikan, rep dan err, mesti diubah suai dalam fungsi tangguh.

Selain itu, terdapat jenis yang tidak sepadan dalam kod. Panik berlaku dengan rentetan, manakala penegasan jenis menjangkakan ralat. Ini akan menyebabkan atur cara panik sekali lagi apabila cuba menukar nilai yang dipulihkan kepada ralat.

Untuk membetulkan kod, kita perlu:

  1. Mengalih keluar percubaan untuk mengembalikan nilai daripada fungsi tangguh.
  2. Pastikan nilai yang dipulihkan ditegaskan dengan betul.

Kod yang diperbetulkan:

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        // Find out the exact error type and set err
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        // Invalidate rep
        rep = nil
    }
}()
Salin selepas log masuk

Dengan perubahan ini, fungsi tangguh kini menetapkan ralat dan rep dengan betul apabila panik berlaku, membolehkan fungsi panggilan mengendalikan ralat dengan sewajarnya.

Atas ialah kandungan terperinci Bolehkah Fungsi Tertunda Mengembalikan Nilai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan