我正在嘗試為 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 關注
- 214 瀏覽
添加回答
舉報
0/150
提交
取消