为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Golang 的回调中使用接口?

如何在 Golang 的回调中使用接口?

Go
收到一只叮咚 2021-12-20 10:50:38
我正在尝试为 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.MessagePromise!= wray.SubscriptionPromise),这就是您的代码无法编译的原因。

你并不需要声明的接口MessagePromise再次,只是使用那些从图书馆。


查看完整回答
反对 回复 2021-12-20
?
噜噜哒

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.SubscriptionPromisePromise

如果你想让你的库更利于接口,你需要改变库本身以接受接口参数并返回接口而不是具体类型。


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信