我正在尝试使用Faye client for Go但是当我尝试为客户端创建一个接口时,由于回调中的类型,它似乎失败了:
package main
import (
"fmt"
"github.com/autogrowsystems/wray"
)
type Message interface {
Data() map[string]interface{}
}
type Promise interface {
Successful() bool
}
type Subscriber interface {
Subscribe(string, bool, func(Message)) (Promise, error)
}
func subscribeMe(subber Subscriber) {
subber.Subscribe("/my/chan", false, func(msg Message) {
fmt.Printf("got data: %+v", msg.Data())
})
}
func main() {
subscribeMe(wray.NewFayeClient("http://localhost/faye"))
fmt.Println("all good!")
}
此时它失败并出现以下错误:
# command-line-arguments
main/fayetest.go:27: cannot use wray.NewFayeClient("http://localhost/faye") (type *wray.FayeClient) as type Subscriber in argument to subscribeMe:
*wray.FayeClient does not implement Subscriber (wrong type for Subscribe method)
have Subscribe(string, bool, func(wray.Message)) (wray.SubscriptionPromise, error)
want Subscribe(string, bool, func(Message)) (Promise, error)
似乎它应该工作,因为客户端确实满足接口:
// wray.go - wray.FayeClient
func (self *FayeClient) Subscribe(channel string, force bool, callback func(Message)) (promise SubscriptionPromise, err error) {
}
// response.go - wray.Message
func (self Message) Data() map[string]interface{} {
}
// wray.go - wray.SubscriptionPromise
func (self SubscriptionPromise) Successful() bool {
}
它应该正常吗?或者回调搞砸了界面的满足感?
编辑:除此之外,我是Faye客户端分支的作者,我能做些什么才能使其有利于接口?除了抛弃回调?
答案 0 :(得分:4)
FayeClient.Subscribe
实现:
Subscribe(string, bool, func(wray.Message)) (wray.SubscriptionPromise, error)
并且您的接口订阅者需要以下功能:
Subscribe(string, bool, func(Message)) (Promise, error)
请注意回调函数的不同参数(Message
!= wray.Message
,Promise
!= wray.SubscriptionPromise
),以及您的代码获胜的原因&# 39; t compile。
您不需要再次声明接口Message
和Promise
,只需使用库中的接口即可。
答案 1 :(得分:0)
尽管你声明了什么,wray.FayeClient
没有实现你的Subscriber
界面,因为它的Subscribe
方法与你界面中定义的签名不同
Subscribe(string, bool, func(wray.Message)) (wray.SubscriptionPromise, error)
与Subscribe(string, bool, func(Message)) (Promise, error)
完全不同。 wray.Message
可以实施Message
,但它仍然是不同的类型。 wray.SubscriptionPromise
和Promise
同样如此。
如果要使库更有利于接口,则需要更改库本身以接受接口参数并返回接口而不是具体类型。