mardi 28 novembre 2017

Golang: Cannot use implementation of interface as argument to func that wants interface

I'm getting the following error:

./main.go:31: cannot use telegramService (type messaging.TelegramService) as type mypackage.MessagingService in argument to mypackage.RegisterMessagingService:
    messaging.TelegramService does not implement mypackage.MessagingService (wrong type for HandleIncomingMessage method)
        have HandleIncomingMessage(telegram.Message) error
        want HandleIncomingMessage(mypackage.IncomingMessage) error

I have an interface that describes a messaging service like Telegram or WhatsApp, and an interface that describes an incoming message from one of those services:

// IncomingMessage is a message that comes in on a messaging service
type IncomingMessage interface {
    Send() error
}

// MessagingService is a service on which messages can be send (like Telegram or FB Messenger)
type MessagingService interface {
    Start()
    HandleIncomingMessage(IncomingMessage) error
    GetHTTPHandler() http.HandlerFunc
    GetCommands() []MessagingCommand
}

The first implementation of MessagingService is for Telegram. The issue is the HandleIncomingMessage function, which currently doesn't really do anything and just looks like this:

// HandleIncomingMessage will take an incoming message and repond to it
func (s TelegramService) HandleIncomingMessage(msg *telegram.Message) error {

    return nil
}

The issue is that this function accepts a telegram.Message, which the compiler says doesn't comply with the interface. The thing is, that telegram.Message is an implementation of IncomingMessage:

// Message is a Telegram message
type Message struct {
    // Added the line below at some point, but it didn't work without it either
    mypackage.IncomingMessage
    MessageID uint64 `json:"message_id"`
    FirstName string `json:"first_name"`
    Username  string `json:"username"`
    Date      uint64 `json:"date"`
    Text      string `json:"text"`
    Chat      Chat   `json:"chat"`
    From      User   `json:"from"`
}

// Send will take m and send it
func (m Message) Send() error {
    // Do stuff

    return nil
}

Initially IncomingMessage was an empty interface, which is where I first noticed the issue. I tried adding the function Send() which I was going to add anyway, as I thought maybe just giving it any struct wouldnt't work. However, I'm still getting this error.

I don't see any reason why telegram.Message doesn't implement the interface, it's pretty straight forward.

Can anyone explain why this doesn't work?

PS: My package isn't actually called mypackage, changed for clarity





Aucun commentaire:

Enregistrer un commentaire