Вызов функции определенного типа в Go

Я полный новичок 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) error {fmt.Printf (p.Topic ()) return nil}),)

2 ответа

Решение

Как показывает ошибка, параметр и то, что вы передаете, не совпадают:

type Handler func(Publication) error

             func(p broker.Publication)

У вас нет возвращаемого значения. Если вы добавите возвращаемое значение (даже если вы всегда возвращаете nil), это будет работать нормально.

Если ваша подпись анонимной функции совпадает с сигнатурой объявления типа обработчика (Адриан правильно указывает, что вы пропускаете возврат ошибки), вы можете просто выполнить преобразование типа:

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
}

Поскольку компилятор знает во время компиляции, что типы совпадают, нет необходимости выполнять дополнительную проверку, как вы могли бы, например, в случае утверждения типа.

Другие вопросы по тегам