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



我来自java。

我使用的框架已经在errs包中定义了一个Error,我想扩展它,这样我可以添加更多的字段。所以我尝试使用go的继承。

// Error to inherit from errs.Error
type MyError struct {
errs.Error
ErrDetail string    //more message to my error
st        []uintptr 
}
// override Error() so that the message can be more specific
func (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是在我的框架中定义的。有解决这个问题的方法吗

您可以使用类型别名:

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 
}

然后像e.SDKErr.GetCode()一样简单地调用errs.Error的方法。然而,例如,如果MyError要序列化为JSON,则errs.Error的字段将显示为嵌套对象,而对于类型别名,它们将是";扁平化";。

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

type Error struct {
Code int
}

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

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

vs命名字段:

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

相关内容

最新更新