如何在golang中扩展没有主体的功能
How to extend a function without body in golang
我想使用 ippy04/messengerbot 库为 Facebook Messenger 构建一个机器人。
为了接收新消息,图书馆使用了一种我无法理解的结构。在相关 library source file:
中定义了以下函数类型(但没有主体)
type MessageReceivedHandler func(*MessengerBot, Event, MessageOpts, ReceivedMessage)
此类型然后 gets attached 到实际的机器人:
type MessengerBot struct {
MessageReceived MessageReceivedHandler
}
稍后在代码中 it gets called 像这样:
if bot.MessageReceived != nil {
go bot.MessageReceived(bot, entry.Event, message.MessageOpts, *message.Message)
}
现在看来我需要在我自己的包中使用实际的主体实现来扩展 MessageReceivedHandler
。我尝试了一些东西。
跟随另一个 我这样做了:
import "github.com/ippy04/messengerbot"
type myMRH messengerbot.MessageReceivedHandler
func (mr myMRH) HRM() {
log.Println("works!")
}
...但是该代码永远不会被调用。
我也尝试像这样扩展 bot.MessageReceived
(我使用的是 GinGonic)
router.POST("/webhook", func(c *gin.Context) {
bot := messengerbot.NewMessengerBot(os.Getenv("FB_PAGE_ACCESS_TOKEN"), os.Getenv("FB_MESSENGER_VERIFY_TOKEN"))
bot.Debug = true
bot.MessageReceived = func(*MessengerBot, Event, MessageOpts, ReceivedMessage) {
log.Println("works!")
}
bot.Handler(c.Writer, c.Request)
})
但是我不知道从哪里获取必要的函数变量,因为它们没有被库公开。
关于如何实施 MessageReceivedHandler
的任何想法?
根据@mykola 的回答,这里是我的问题的完整解决方案:
router.POST("/webhook", func(c *gin.Context) {
bot := messengerbot.NewMessengerBot(os.Getenv("FB_PAGE_ACCESS_TOKEN"), os.Getenv("FB_MESSENGER_VERIFY_TOKEN"))
bot.Debug = true
bot.MessageReceived = func(bot *messengerbot.MessengerBot, evt messengerbot.Event, opts messengerbot.MessageOpts, msg messengerbot.ReceivedMessage) {
log.Println(msg.Message.Text)
}
bot.Handler(c.Writer, c.Request)
})
某人在某处声明了从 messengerbot.MessageReceivedHandler
派生的新类型这一事实不会也不应该对 bot 库本身产生任何影响。
您需要的是在构造点设置机器人的处理程序,通过自己实例化,或者稍后通过
bot.MessageReceived = func(bot *MessengerBot, evt Event, opts MessageOpts, msg ReceivedMessage) {
log.Println("works!", msg)
}
P.S。如果您还没有检查 tour of go,您可能想检查一下,因为您似乎错过了一些使用 go 的基本概念。
我想使用 ippy04/messengerbot 库为 Facebook Messenger 构建一个机器人。
为了接收新消息,图书馆使用了一种我无法理解的结构。在相关 library source file:
中定义了以下函数类型(但没有主体)type MessageReceivedHandler func(*MessengerBot, Event, MessageOpts, ReceivedMessage)
此类型然后 gets attached 到实际的机器人:
type MessengerBot struct {
MessageReceived MessageReceivedHandler
}
稍后在代码中 it gets called 像这样:
if bot.MessageReceived != nil {
go bot.MessageReceived(bot, entry.Event, message.MessageOpts, *message.Message)
}
现在看来我需要在我自己的包中使用实际的主体实现来扩展 MessageReceivedHandler
。我尝试了一些东西。
跟随另一个
import "github.com/ippy04/messengerbot"
type myMRH messengerbot.MessageReceivedHandler
func (mr myMRH) HRM() {
log.Println("works!")
}
...但是该代码永远不会被调用。
我也尝试像这样扩展 bot.MessageReceived
(我使用的是 GinGonic)
router.POST("/webhook", func(c *gin.Context) {
bot := messengerbot.NewMessengerBot(os.Getenv("FB_PAGE_ACCESS_TOKEN"), os.Getenv("FB_MESSENGER_VERIFY_TOKEN"))
bot.Debug = true
bot.MessageReceived = func(*MessengerBot, Event, MessageOpts, ReceivedMessage) {
log.Println("works!")
}
bot.Handler(c.Writer, c.Request)
})
但是我不知道从哪里获取必要的函数变量,因为它们没有被库公开。
关于如何实施 MessageReceivedHandler
的任何想法?
根据@mykola 的回答,这里是我的问题的完整解决方案:
router.POST("/webhook", func(c *gin.Context) {
bot := messengerbot.NewMessengerBot(os.Getenv("FB_PAGE_ACCESS_TOKEN"), os.Getenv("FB_MESSENGER_VERIFY_TOKEN"))
bot.Debug = true
bot.MessageReceived = func(bot *messengerbot.MessengerBot, evt messengerbot.Event, opts messengerbot.MessageOpts, msg messengerbot.ReceivedMessage) {
log.Println(msg.Message.Text)
}
bot.Handler(c.Writer, c.Request)
})
某人在某处声明了从 messengerbot.MessageReceivedHandler
派生的新类型这一事实不会也不应该对 bot 库本身产生任何影响。
您需要的是在构造点设置机器人的处理程序,通过自己实例化,或者稍后通过
bot.MessageReceived = func(bot *MessengerBot, evt Event, opts MessageOpts, msg ReceivedMessage) {
log.Println("works!", msg)
}
P.S。如果您还没有检查 tour of go,您可能想检查一下,因为您似乎错过了一些使用 go 的基本概念。