首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计一个接口,返回另一个只能满足紧急情况的接口类型

如何设计一个接口,返回另一个只能满足紧急情况的接口类型
EN

Stack Overflow用户
提问于 2019-09-06 14:33:05
回答 2查看 91关注 0票数 1

简短的前提:我尝试设计一个包,其中包含几种类型的包,这些类型填充相同的一组接口,另一个包使用这些接口。现在我很困惑如何实现一个返回另一个接口类型的接口。

更长:更具体地说:我有两种协议/消息类型(广播/直接),我希望能够打包通过http/json和amqp/rabbit传输。我的“传输”广播(json和amqp)需要我的消息包(dm/-packages)来实现/呈现一些信息:例如GetAddressNewResponse。对于NewResponse,我的消息格式根据它的元信息生成一个ResponseMessage。我的传输器知道如何将GetAddress转换为有用的路由信息。这就是我的接口问题:现在我不知道如何实现一个返回另一个接口类型的接口。

代码语言:javascript
复制
type Addresser interface {
    GetRecipientAddress() string
}

type Responder interface {
    NewResponse() (Responder, error)
}

type DM struct {
}

func (dm *DM) GetRecipientAddress() string {
    return ""
}

func (dm *DM) NewResponse() (*DM, error) {
    return dm, nil
}

只要我的(dm *DM) NewResponse返回ResponderResponder接口就完成了。当我返回满足Responder*DM时,*DM不满足Responder

我有点明白这似乎是一个鸡或蛋的问题,只要我返回*DM*DM就不会满足Responder,但“事实上”它会满足它。

这就是我的假设:我试图为接口的使用实现一个糟糕的设计。谁能告诉我高朗古鲁解决这个问题的方向?

我认为这可能是一种解决方案,但它似乎同样有缺陷

代码语言:javascript
复制
type AddressResponder interface {
    Addresser
    Responder
}

func (dm *DM) NewResponse() (AddressResponder, error) {
    return dm, nil
}
EN

回答 2

Stack Overflow用户

发布于 2019-09-06 14:58:15

请参阅Type identity

如果两个接口类型具有相同的名称和相同的函数类型,则它们是相同的。来自不同包的非导出方法名称总是不同的。方法的顺序是不相关的。

如果两个函数类型具有相同数量的参数和结果值,则它们是相同的,相应的参数和结果类型是相同的,并且这两个函数要么是可变的,要么都不是。参数名和结果名不需要匹配。

试试this

代码语言:javascript
复制
// NewResponse returns  (Responder, error)
func (dm *DM) NewResponse() (Responder, error) {
    return dm, nil
}
票数 2
EN

Stack Overflow用户

发布于 2019-09-06 18:33:33

类型DM仅当且仅当它具有Responder中描述的方法时才能填充Responder。我明白你的意思,但这就是Golang的工作方式!

换句话说,DM必须有签名NewResponse() (Responder, error)的方法,否则它不会实现Responder

因此,您可能必须将定义更改为:

代码语言:javascript
复制
type DM struct {
}

func (dm *DM) NewResponse() (Responder, error) {
    return dm, nil
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57816821

复制
相关文章

相似问题

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