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

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


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 Client 那个分支的作者,我能做些什么来使它有利于接口?除了放弃回调?


收到一只叮咚
浏览 173回答 2
2回答

萧十郎

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再次,只是使用那些从图书馆。

噜噜哒

不管你声称什么,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。如果你想让你的库更利于接口,你需要改变库本身以接受接口参数并返回接口而不是具体类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go