登录
首页 >  Golang >  Go教程

Go RPC 服务端和客户端错误比较:为何 errors.Is 无法准确识别相同错误?

时间:2024-11-13 14:40:11 466浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Go RPC 服务端和客户端错误比较:为何 errors.Is 无法准确识别相同错误? 》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

Go RPC 服务端和客户端错误比较:为何 errors.Is 无法准确识别相同错误?

go rpc 服务端和客户端的错误比较

在使用 go rpc 时,服务端和客户端返回的错误类型可能不相同。例如,客户端可能返回 gorm.errrecordnotfound 错误,而服务端返回相同的错误类型时,使用 errors.is 比较后却得到 false。

要通过 errors.is 来比较错误,需要深入理解 errors.is 的本质。errors.is 比较的是错误是否 "同源",即比较包装后的错误是否属于源错误。

在 rpc 中,编码和解码过程可能会修改错误类型。下面是一个简单的代码示例,展示了 errors.is 在进行 rpc 编解码后的比较结果:

package main

import (
    "bytes"
    "encoding/gob"
    "errors"
    "fmt"
    "log"
)

type MyError struct {
    Msg string
}

func (m MyError) Error() string {
    return m.Msg
}

func main() {
    input := []byte{29, 255, 129, 3, 1, 1, 7, 77, 121, 69, 114, 114, 111, 114, 1, 255, 130, 0, 1, 1, 1, 3, 77, 115, 103, 1, 12, 0, 0, 0, 8, 255, 130, 1, 3, 116, 116, 116, 0}
    buf := bytes.NewBuffer(input)
    dec := gob.NewDecoder(buf)

    m := MyError{}

    if err := dec.Decode(&m); err != nil {
        log.Fatal(err)
    }

    fmt.Println("error msg is:", m)

    fmt.Println(errors.Is(m, MyError{}))
}

这段代码将自定义错误 myerror 编码,然后解码。解码后,使用 errors.is 比较错误是否相同。结果是 false。这是因为编码和解码过程会修改错误的底层类型。

因此,直接比较错误类型并不是一种可靠的方法。建议使用错误编码或消息进行比较,以确保在不同的上下文中也能正确比较错误。

终于介绍完啦!小伙伴们,这篇关于《Go RPC 服务端和客户端错误比较:为何 errors.Is 无法准确识别相同错误? 》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>