为了账号安全,请及时绑定邮箱和手机立即绑定

扩展错误结构,但遇到类型“*MyError”同时具有名为“错误”的字段和方法

扩展错误结构,但遇到类型“*MyError”同时具有名为“错误”的字段和方法

Go
精慕HU 2022-11-23 19:19:19
我来自爪哇。我正在使用一个已经定义了Errorinerrs包的框架,我想扩展它以便我可以向它添加更多字段。所以我尝试使用go的继承。// Error to inherit from errs.Errortype MyError struct {    errs.Error    ErrDetail string    //more message to my error    st        []uintptr }// override Error() so that the message can be more specificfunc (e *MyError) Error() string {    if e == nil {        return ErrorCodeSuccess.ErrDetail    }    return fmt.Sprintf("Code:%d, ErrDetail:%s, Msg:%s", e.GetCode(), e.GetErrDetail(), e.GetMsg())} 这对于 Java 程序员来说非常简单。但我明白了 Type '*MyError' has both field and method named 'Error'.这非常令人沮丧,因为方法 Error 是在内置包中Error定义的,而名称是在我的框架中定义的,有没有解决这个问题的解决方法?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

您可以使用类型别名:


type SDKErr = errs.Error


// Error to inherit from errs.Error

type MyError struct {

    SDKErr

    ErrDetail string    //more message to my error

    st        []uintptr 

}


func (e *MyError) Error() string {

    // ...

现在嵌入字段的名字是SDKErr,但是不会和方法名冲突,errs.Error不需要转换就可以用在任何需要的地方。


游乐场:https ://go.dev/play/p/XSWi5hzHGPh


当然你也可以使用命名字段,而不是别名:


type MyError struct {

    SDKErr errs.Error

    ErrDetail string    //more message to my error

    st        []uintptr 

}

然后调用errs.Errorsimply like的方法e.SDKErr.GetCode()。但是MyError,例如,如果要序列化为 JSON,则字段errs.Error将显示为嵌套对象,而使用类型别名时,它们将被“扁平化”。


基本上如果errs.Error被定义为:


type Error struct {

    Code int

}

使用类型别名和嵌入字段,JSON 看起来像:


{"Code":0,"ErrDetail":""}

与命名字段:


{"SDKErr":{"Code":0},"ErrDetail":""}


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号