Вызов функции определенного типа в Go - PullRequest
0 голосов
/ 14 ноября 2018

Я полный новичок 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 ()) вернуть ноль }), ) * * Тысяча двадцать-один

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

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

type Handler func(Publication) error

             func(p broker.Publication)

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

0 голосов
/ 14 ноября 2018

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

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
}

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

...