type BizError struct {
Code string
Mesg string
}
type ApiReply struct {
Err BizError
}
type GetDataReply struct {
Data interface{}
ApiReply
}
根据上述定义,我想做以下事项:
func Func1(data interface{}) {
switch data.(type) {
case ApiReply:
data.(ApiReply).Err.Code = "0"
}
}
关键问题是在Func1中,类型开关不知道任何嵌入ApiReply的新类型,它是一个“通用”处理程序。而data
传递给它实际上是ApiReply的“儿童班”。显然,在Go中,你不能断言GetDataReply类型为ApiReply。
我如何处理这种情况,以便在Func1中我不需要拥有所有可能嵌入ApiReply显式声明的结构?
答案 0 :(得分:0)
您正在尝试在go中实现继承样式系统。结构嵌入不是继承,不应该被认为或被视为继承。这是一种反模式,通常无法按照您的期望或期望工作。
相反,更惯用的方法是定义一个接口(或几个接口),让你的响应类型实现必要的符合方法。
type ApiReply interface {
Status() (string, string)
Body() (io.Reader, error)
}
type BizError struct {
Code string
Mesg string
}
func (b BizError) Status() (string, string) {
return b.Code, b.Mesg
}
func (b BizError) Body() (io.Reader, error) {
return nil, errors.New("BizError never contains a body")
}
然后,您将在其他响应类型结构上实现ApiReply
。我当然猜测你在这里真正需要什么,但希望这可以解决问题。
如果你发现必须,你现在可以对你收到的ApiReply
实例进行类型切换,如果绝对必要的话,可以使用特殊情况下的任何基础类型。