go
的rpc
服务端返回的gorm.ErrRecordNotFound
与客户端的gorm.ErrRecordNotFound
使用errors.Is
比较的结果为false
。
尝试在两端都注册:
gob.Register(gorm.ErrRecordNotFound)
errors.Is
依旧返回false
。
现在的解决方案是直接比较字符串的相等性来判断是不是ErrRecordNotFound
错误。
想问下,如果利用errors.Is
来比较的话,要怎样实现?
go
的rpc
服务端返回的gorm.ErrRecordNotFound
与客户端的gorm.ErrRecordNotFound
使用errors.Is
比较的结果为false
。
尝试在两端都注册:
gob.Register(gorm.ErrRecordNotFound)
errors.Is
依旧返回false
。
现在的解决方案是直接比较字符串的相等性来判断是不是ErrRecordNotFound
错误。
想问下,如果利用errors.Is
来比较的话,要怎样实现?
代码写错了吧。。。
func TestName(t *testing.T) {
t.Log(errors.Is(gorm.ErrRecordNotFound, gorm.ErrRecordNotFound)) //true
}
7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.4k 阅读
2 回答879 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.1k 阅读
首先从 is 方法出发,这个方法本质是比较 error 是否同源,即用于将比较包装后的 error 是否为源 error

然后从 gob 编码角度出发,下面的代码或许能简单的去测试和理解
// 其实我觉得可以简单理解为如下这样,虽然有失偏颇
经过编码后两者应该并不同源,故应该无法相等。
个人建议:无论结果或原因如何,项目中并不建议直接比较错误类型,建议采用错误编码,code 或 msg 更稳妥,这也是 grpc 有 code status 的原因吧。