gpt4 book ai didi

go - 不能将接口(interface)的实现用作需要接口(interface)的 func 的参数

转载 作者:数据小太阳 更新时间:2023-10-29 03:42:17 32 4
gpt4 key购买 nike

我收到以下错误:

./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 等消息服务的接口(interface),以及一个描述来自其中一项服务的传入消息的接口(interface):

// 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,编译器说它不符合接口(interface)。问题是,telegram.MessageIncomingMessage实现:

// 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 是一个空接口(interface),这是我第一次注意到这个问题的地方。我尝试添加函数 Send() 无论如何我都会添加它,因为我认为可能只给它任何结构都行不通。但是,我仍然收到此错误。

我看不出 telegram.Message 没有实现接口(interface)的任何原因,它非常简单。

谁能解释为什么这不起作用?

PS:我的包实际上并没有被称为mypackage,为清楚起见进行了更改

最佳答案

HandleIncomingMessage 必须采用 IncomingMessage 参数,因为这是定义接口(interface)的方式。您不能定义采用其他类型作为参数的 HandleIncomingMessage 实现,即使该类型实现了 IncomingMessage。您可以定义函数以获取 IncomingMessage 并使用类型断言将其转换为 *telegram.Message:

func (s TelegramService) HandleIncomingMessage(im IncomingMessage) error {
msg := im.(*telegram.Message)
return nil
}

我假设您确实想要使用指向 telegram.Message 的指针。如果是这样,您需要更改 Send 方法的定义以获取指针接收器。

关于go - 不能将接口(interface)的实现用作需要接口(interface)的 func 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538723/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com