2

我是一个完整的围棋新手,很抱歉提前提出问题。

我正在尝试使用如此定义的接口来连接到消息代理:

// Broker is an interface used for asynchronous messaging.
type Broker interface {
    Options() Options
    Address() string
    Connect() error
    Disconnect() error
    Init(...Option) error
    Publish(string, *Message, ...PublishOption) error
    Subscribe(string, Handler, ...SubscribeOption) (Subscriber, error)
    String() string
}

// Handler is used to process messages via a subscription of a topic.
// The handler is passed a publication interface which contains the
// message and optional Ack method to acknowledge receipt of the message.
type Handler func(Publication) error

// Publication is given to a subscription handler for processing
type Publication interface {
    Topic() string
    Message() *Message
    Ack() error
}

我正在尝试使用Subscribe-function 订阅一个频道,这就是我现在苦苦挣扎的地方。我目前的方法是以下一种:

natsBroker.Subscribe(
        "QueueName",
        func(p broker.Publication) {
            fmt.Printf(p.Message)
        },
    )

错误输出是cannot use func literal (type func(broker.Publication)) as type broker.Handler in argument to natsBroker.Subscribe
但是我如何确保函数类型实际上是 a broker.Handler

谢谢你的时间!

更新

万一有人感兴趣,错误返回类型丢失导致错误,所以它应该看起来类似于:

natsBroker.Subscribe("QueueName", broker.Handler(func(p broker.Publication) error { fmt.Printf(p.Topic()) return nil }), )

4

2 回答 2

4

如错误所示,参数和您传递的内容不匹配:

type Handler func(Publication) error

             func(p broker.Publication)

你没有返回值。如果你添加一个返回值(即使你总是 return nil),它会正常工作。

于 2018-11-14T19:48:20.360 回答
1

如果您的匿名函数的签名与处理程序类型声明的签名匹配(Adrian 正确地指出您缺少错误返回),您应该能够进行类型转换

package main

import "fmt"

type Handler func(int) error

var a Handler

func main() {
    a = Handler(func(i int) error {
        return nil
    })

    fmt.Println(isHandler(a))
}

func isHandler(h Handler) bool {
    return true
}

由于编译器在编译器时知道类型匹配,因此不需要像在类型断言的情况下那样进行额外的检查。

于 2018-11-14T19:21:15.690 回答