使用embeded类型键入断言

时间:2018-06-09 14:35:24

标签: go type-assertion

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显式声明的结构?

1 个答案:

答案 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实例进行类型切换,如果绝对必要的话,可以使用特殊情况下的任何基础类型。