如何在golang中扩展没有body的函数

时间:2017-01-29 10:02:35

标签: inheritance go facebook-messenger-bot

我想使用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实际的body实现。我试了几件事。

SO thread后,我做了这个:

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)
})

1 个答案:

答案 0 :(得分:2)

事实上,某个人声称从int peekc(FILE *fp) { int c = getc(fp); if (c != EOF) ungetc(c, fp); return c; } void rcomment(int c, FILE *fp) { int d; if (c == '/') { if ((d = getc(fp)) == '*') { incomment(fp); } else if (d == '/') { while ((c = getc(fp)) != EOF && c != '\n') { if (c == '\\' && peekc(fp) == '\n') { putchar(getc(fp)); } } putchar('\n'); } else { putchar(c); ungetc(d, fp); } } else if (c == '\'' || c == '"') { echo_quote(c, fp); } else { putchar(c); } } 派生的新类型不会也不会对机器人库本身产生任何影响。

你需要的是在构造点设置机器人的处理程序,通过自己实例化,或者稍后通过

实例化
messengerbot.MessageReceivedHandler

P.S。如果你还没有,你可能想查看tour of go,因为你似乎错过了使用go的一些基本概念。