亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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.Message、Promise!= 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 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號