我正在尝试为 Go使用Faye 客户端,但是当我尝试为客户端创建接口时,由于回调中的类型,它似乎失败了:package mainimport ( "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-argumentsmain/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.FayeClientfunc (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.SubscriptionPromisefunc (self SubscriptionPromise) Successful() bool {}它应该可以正常工作吗?还是回调搞乱了界面的满意度?编辑:顺便说一句,我是 Faye Client 那个分支的作者,我能做些什么来使它有利于接口?除了放弃回调?
2 回答
萧十郎
TA贡献1815条经验 获得超13个赞
FayeClient.Subscribe
实施:
Subscribe(string, bool, func(wray.Message)) (wray.SubscriptionPromise, error)
并且您的接口 Subscriber 需要以下功能:
Subscribe(string, bool, func(Message)) (Promise, error)
请注意回调函数的不同参数(Message
!= wray.Message
、Promise
!= wray.SubscriptionPromise
),这就是您的代码无法编译的原因。
你并不需要声明的接口Message
和Promise
再次,只是使用那些从图书馆。
噜噜哒
TA贡献1784条经验 获得超7个赞
不管你声称什么,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
。
如果你想让你的库更利于接口,你需要改变库本身以接受接口参数并返回接口而不是具体类型。
- 2 回答
- 0 关注
- 172 浏览
添加回答
举报
0/150
提交
取消