Вызов функции определенного типа в 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
}
Поскольку компилятор знает во время компиляции, что типы совпадают, нет необходимости выполнять дополнительную проверку, как вы могли бы, например, в случае утверждения типа.