首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有嵌入类型的类型断言

具有嵌入类型的类型断言
EN

Stack Overflow用户
提问于 2018-06-09 22:35:24
回答 1查看 121关注 0票数 1
代码语言:javascript
复制
type BizError struct {
    Code string
    Mesg string
}

type ApiReply struct {
    Err BizError
}

type GetDataReply struct {
    Data interface{}
    ApiReply
}

有了上面的定义,我想做以下事情:

代码语言:javascript
复制
func Func1(data interface{}) {
    switch data.(type) {
    case ApiReply:
        data.(ApiReply).Err.Code = "0"
    }
}

关键问题是,在Func1中,类型切换器不知道嵌入ApiReply的任何新类型,它是一个“通用”处理程序。而传递给它的data实际上是ApiReply的“子类”。显然,在Go中,您不能对ApiReply断言GetDataReply类型。

如何处理这种情况,以便在Func1中不需要显式声明可能嵌入ApiReply的所有可能的结构?

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 01:01:36

你正试图在go中实现一个继承风格的系统。结构嵌入不是继承,也不应该被认为是继承。这是go中的一种反模式,通常不会像您希望或期望的那样工作。

相反,更常用的方法是定义一个接口(或几个接口),并让您的响应类型实现必要的方法以符合要求。

代码语言:javascript
复制
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实例进行类型切换,如果绝对必要,还可以针对任何底层类型进行特殊情况切换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50775367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档