Go中特定类型的调用函数

时间:2018-11-14 19:11:47

标签: go go-micro

我是Go的新手,因此对不起。

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

// 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函数来订阅频道,这就是我现在正在努力的地方。 我当前的方法是以下方法:

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
但是,如何确保函数类型实际上是broker.Handler

提前感谢您!

更新

如果有人感兴趣,那么会丢失导致错误的错误返回类型,因此它应类似于:

natsBroker.Subscribe(     “ QueueName”,     broker.Handler(func(p broker.Publication)错误{         fmt.Printf(p.Topic())         返回零     }), )

2 个答案:

答案 0 :(得分:4)

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

type Handler func(Publication) error

             func(p broker.Publication)

您没有返回值。如果您添加一个返回值(即使您总是返回nil),也可以正常工作。

答案 1 :(得分:1)

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

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
}

由于编译器在编译时就知道类型匹配,因此无需进行其他检查,就像在a type assertion情况下那样。