2016-03-01 23 views
0

我试图用一个Faye client for Go但是当我尝试做一个接口,似乎失败的原因在回调类型的客户端:如何在Golang中使用一个回调接口?

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 { 
} 

它应该工作右击T'或者回调是否让界面满意?作为一个旁人,我是Faye客户端的分支的作者,有什么我可以做的,使它有利于接口?除了放弃回拨?

回答

3

FayeClient.Subscribe工具:

Subscribe(string, bool, func(wray.Message)) (wray.SubscriptionPromise, error) 

和你的接口用户需要的功能:

Subscribe(string, bool, func(Message)) (Promise, error) 

通知回调函数的不同参数(!Message = wray.MessagePromise = wray.SubscriptionPromise),和这就是为什么你的代码不能编译。

您不需要再声明接口MessagePromise,只需使用库中的接口即可。

+0

对不起,我应该提到我也尝试过,但它抱怨'func(Message)!= func(wray.Message)'......更新了这个问题。 – komatsu

+0

我的回复已更新:-) – cd1

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.SubscriptionPromisePromise也是如此。

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

+0

因此,如果我在回调中创建一个接口它应该工作?我是不是会遇到同样的问题,它会要求'wray.MessageInterface'(例如)在签名中? – komatsu