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

时间:2016-03-01 20:38:26

标签: go interface faye

我正在尝试使用Faye client for Go但是当我尝试为客户端创建一个接口时,由于回调中的类型,它似乎失败了:

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

它应该正常吗?或者回调搞砸了界面的满足感?

编辑:除此之外,我是Faye客户端分支的作者,我能做些什么才能使其有利于接口?除了抛弃回调?

2 个答案:

答案 0 :(得分:4)

FayeClient.Subscribe实现:

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

并且您的接口订阅者需要以下功能:

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

请注意回调函数的不同参数(Message!= wray.MessagePromise!= wray.SubscriptionPromise),以及您的代码获胜的原因&# 39; t compile。

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

答案 1 :(得分: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同样如此。

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