简短的前提:我尝试设计一个包,其中包含几种类型的包,这些类型填充相同的一组接口,另一个包使用这些接口。现在我很困惑如何实现一个返回另一个接口类型的接口。
更长:更具体地说:我有两种协议/消息类型(广播/直接),我希望能够打包通过http/json和amqp/rabbit传输。我的“传输”广播(json和amqp)需要我的消息包(dm/-packages)来实现/呈现一些信息:例如GetAddress或NewResponse。对于NewResponse,我的消息格式根据它的元信息生成一个ResponseMessage。我的传输器知道如何将GetAddress转换为有用的路由信息。这就是我的接口问题:现在我不知道如何实现一个返回另一个接口类型的接口。
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返回Responder,Responder接口就完成了。当我返回满足Responder的*DM时,*DM不满足Responder。
我有点明白这似乎是一个鸡或蛋的问题,只要我返回*DM,*DM就不会满足Responder,但“事实上”它会满足它。
这就是我的假设:我试图为接口的使用实现一个糟糕的设计。谁能告诉我高朗古鲁解决这个问题的方向?
我认为这可能是一种解决方案,但它似乎同样有缺陷
type AddressResponder interface {
Addresser
Responder
}
func (dm *DM) NewResponse() (AddressResponder, error) {
return dm, nil
}发布于 2019-09-06 14:58:15
如果两个接口类型具有相同的名称和相同的函数类型,则它们是相同的。来自不同包的非导出方法名称总是不同的。方法的顺序是不相关的。
如果两个函数类型具有相同数量的参数和结果值,则它们是相同的,相应的参数和结果类型是相同的,并且这两个函数要么是可变的,要么都不是。参数名和结果名不需要匹配。
试试this
// NewResponse returns (Responder, error)
func (dm *DM) NewResponse() (Responder, error) {
return dm, nil
}发布于 2019-09-06 18:33:33
类型DM仅当且仅当它具有Responder中描述的方法时才能填充Responder。我明白你的意思,但这就是Golang的工作方式!
换句话说,DM必须有签名NewResponse() (Responder, error)的方法,否则它不会实现Responder。
因此,您可能必须将定义更改为:
type DM struct {
}
func (dm *DM) NewResponse() (Responder, error) {
return dm, nil
}https://stackoverflow.com/questions/57816821
复制相似问题