如何在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 的基本概念。