Apabila melakukan operasi perbandingan di Golang, anda kadangkala menghadapi beberapa ralat. Ralat ini boleh menyebabkan program berkelakuan tidak betul atau menghasilkan keputusan yang tidak dijangka. Artikel ini akan menggunakan pengenalan strawberi editor PHP untuk menganalisis ralat yang mungkin berlaku apabila membandingkan dalam Golang dan menyediakan penyelesaian yang sepadan. Dengan memahami ralat biasa ini, kami dapat memahami dan menggunakan operasi perbandingan Golang dengan lebih baik dan meningkatkan kestabilan dan ketepatan program. Mari kita meneroka bersama-sama!
Hari ini saya menghadapi masalah semasa cuba melaksanakan ralat tersuai. Perkhidmatan saya mempunyai dua jenis ralat: ralat biasa untuk ralat dalaman dan ralat pengguna untuk mengendalikan ralat berkaitan pengguna. Jadi saya mempunyai struktur untuk ralat pengguna yang mengandungi beberapa metadata dan fungsi untuk mengendalikan ralat. Dalam fungsi ini saya menggunakan pembungkus untuk ralat standard. Sebagai fungsi. Tetapi cara ia berfungsi adalah pelik: atas sebab tertentu, ia juga menganggap ralat biasa sebagai ralat pengguna. Berikut ialah coretan kod:
<code>package main import ( "errors" "fmt" ) type UserError struct { Message string } func (u *UserError) Error() string { return u.Message } func As(sourceError, targetError error) bool { return errors.As(sourceError, &targetError) } func AsV2(sourceError error, targetError interface{}) bool { return errors.As(sourceError, &targetError) } func IsUserError(err error) bool { var userError *UserError return errors.As(err, &userError) } func main() { userError := errors.New("test Error") var emptyError *UserError fmt.Println(As(userError, emptyError)) fmt.Println(AsV2(userError, emptyError)) fmt.Println(IsUserError(userError)) } </code>
Di sini saya sedang menguji fungsi yang menerima dua ralat dan membandingkannya (As dan AsV2). Satu-satunya perbezaan ialah fungsi kedua menerima antara muka ralat sasaran dan bukannya jenis ralat. Dalam fungsi IsUserError saya mencipta penunjuk UserError secara manual dan memberikannya kepada fungsi Errors.As. Tetapi apabila mengeluarkan program ini saya mendapat ini:
true true false
Jadi persoalan saya ialah mengapa ralat berlaku dalam dua kes pertama. Iaitu, ia adalah jenis ralat yang sama, tetapi hanya dalam kes ketiga adakah ia memberikan jawapan yang betul? Adakah saya salah faham cara antara muka berfungsi dalam Go?
Bukan begitu. Dalam dua kes pertama, ia melaporkan ralat dengan betul masing-masing sebagai Error
和 interface{}
. Fungsi pembungkus yang tidak diperlukan yang anda tambahkan sedang mencipta arahan yang menjadikannya lebih mengelirukan, tetapi jika anda memanggil:
var emptyError *UserError fmt.Println(errors.As(userError, emptyError))
Anda mendapat hasil yang diharapkan. IsUserError
按预期工作,因为它将正确的类型传递给 errors.Is
。我已经清理了您的代码以正常工作(Error
采用非指针接收器,并且不将 emptyError
保留为 nil
), anda boleh melihatnya beraksi di sini: https://go.dev/play/p/c5EPB5IGeD5
type UserError struct { Message string } func (u UserError) Error() string { return u.Message } func main() { userError := errors.New("test Error") var emptyError UserError fmt.Println(errors.As(userError, &emptyError)) }
Atas ialah kandungan terperinci Ralat semasa membuat perbandingan di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!