我收到以下错误:
./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
我有一个描述电报服务(例如Telegram或WhatsApp)的接口,以及一个描述从其中一项服务传入的消息的接口:
// 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
}
MessagingService
的第一个实现用于Telegram。问题是HandleIncomingMessage
函数,该函数目前实际上并没有做任何事情,只是看起来像这样:// HandleIncomingMessage will take an incoming message and repond to it
func (s TelegramService) HandleIncomingMessage(msg *telegram.Message) error {
return nil
}
问题在于此函数接受
telegram.Message
,编译器说它不符合该接口。事实是,telegram.Message
是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
}
最初
IncomingMessage
是一个空接口,这是我第一次注意到该问题的地方。我尝试添加我将要添加的函数Send()
,因为我认为可能只是给它任何结构都行不通。但是,我仍然收到此错误。我看不出
telegram.Message
没有实现该接口的任何原因,这很简单。谁能解释为什么这行不通?
PS:我的包裹实际上不是
mypackage
,为了清楚起见已更改 最佳答案
HandleIncomingMessage
必须采用IncomingMessage
参数,因为这是定义接口的方式。您不能定义以其他类型作为参数的HandleIncomingMessage
实现,即使该类型实现IncomingMessage
。您可以定义函数以使用IncomingMessage
并使用类型断言将其转换为*telegram.Message
:
func (s TelegramService) HandleIncomingMessage(im IncomingMessage) error {
msg := im.(*telegram.Message)
return nil
}
我假设您实际上要使用指向
telegram.Message
的指针。如果是这样,则需要更改Send
方法的定义以采用指针接收器。