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

Bolehkah Fungsi Tertunda Mengembalikan Nilai dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-16 17:46:03860semak imbas

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.")
    // ...
}

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
    }
}()

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!

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