我来自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":""}