Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat semasa membuat perbandingan di Golang

Ralat semasa membuat perbandingan di Golang

王林
王林ke hadapan
2024-02-12 08:20:071004semak imbas

在 Golang 中比较时出现错误

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!

Kandungan soalan

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?

Penyelesaian

Bukan begitu. Dalam dua kes pertama, ia melaporkan ralat dengan betul masing-masing sebagai Errorinterface{}. 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!

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