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中,您不能对ApiReply断言GetDataReply类型。
如何处理这种情况,以便在Func1中不需要显式声明可能嵌入ApiReply的所有可能的结构?
发布于 2018-06-10 01:01:36
你正试图在go中实现一个继承风格的系统。结构嵌入不是继承,也不应该被认为是继承。这是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
实例进行类型切换,如果绝对必要,还可以针对任何底层类型进行特殊情况切换。
https://stackoverflow.com/questions/50775367
复制相似问题