Rumah >pembangunan bahagian belakang >Golang >Adakah `Is()` dan `As()` Go Benar-benar Menawarkan Pembukaan Ralat Rekursif?

Adakah `Is()` dan `As()` Go Benar-benar Menawarkan Pembukaan Ralat Rekursif?

Patricia Arquette
Patricia Arquetteasal
2024-12-15 19:29:10936semak imbas

Does Go's `Is()` and `As()` Truly Offer Recursive Error Unwrapping?

Adakah Ralat Mengendalikan Tuntutan Rekursi Go Tepat?

Fungsi pengendalian ralat Go, Is() dan As(), mendakwa sebagai rekursif, membolehkan pembongkaran berbilang bersarang kesilapan. Walau bagaimanapun, tidak jelas sama ada wujud jenis terbina dalam yang melaksanakan antara muka ralat dan menyokong fungsi rekursif ini tanpa masalah.

Pelaksanaan Tersuai yang Cacat

Percubaan untuk mencipta tersuai jenis ralat sering menghadapi masalah berpunca daripada fakta bahawa ralat dibandingkan dengan alamat dalam Go. Jenis tersuai yang membalut ralat sebagai penunjuk mengakibatkan tingkah laku yang tidak dijangka, seperti ralat induk yang diubah suai yang mempengaruhi pembalut berikutnya.

Penyelesaian Boleh Digunakan

Penyelesaian yang lebih mantap melibatkan penciptaan jenis ralat baharu, errorChain. Jenis ini mengandungi medan ralat untuk menyimpan ralat semasa dan medan seterusnya untuk merujuk ralat seterusnya dalam rantaian. Selain itu, ia melaksanakan kaedah Is() dan As() untuk memudahkan pembongkaran ralat rekursif.

Membungkus dan Membuka

Fungsi Wrap() mengambil berbilang ralat, mencipta objek errorChain, dan menghubungkannya bersama-sama. Fungsi Unwrap() melintasi rantai, mengembalikan ralat seterusnya dalam jujukan.

Contoh

Menggunakan jenis Ralat Rantai, anda boleh membalut dan membuka ralat secara rekursif:

type errorChain struct {
    err  error
    next *errorChain
}

func Wrap(errs ...error) error {
    out := errorChain{err: errs[0]}

    n := &out
    for _, err := range errs[1:] {
        n.next = &errorChain{err: err}
        n = n.next
    }

    return out
}

func (c errorChain) Is(err error) bool {
    return c.err == err
}

func (c errorChain) As(target any) bool {
    return errors.As(c.err, target)
}

Taman permainan: https://go.dev/play/p/6BYGgIb728k

Atas ialah kandungan terperinci Adakah `Is()` dan `As()` Go Benar-benar Menawarkan Pembukaan Ralat Rekursif?. 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