如何拆分传递给方法的接口

How to split the interface passed to the method

我使用这个库 tucnak/telebot 构建了一个电报机器人。

方法b.Handle()有两个参数,例如Handle(endpoint interface{}, handler interface{})`

这是我用于初学者的代码

func main() {
    b, err := tb.NewBot(tb.Settings{
        Token:  "TOKEN_HERE",
        Poller: &tb.LongPoller{Timeout: 10 * time.Second},
    })

    if err != nil {
        log.Fatal(err)
        return
    }
    // i want to split this(interface)
    b.Handle("/hello", func(m *tb.Message) {
        b.Send(m.Sender, "Hello World!")
    })

    b.Start()
}

这是我尝试编译的内容:

func main() {
    b, err := tb.NewBot(tb.Settings{
        Token:  "TOKEN_HERE",
        Poller: &tb.LongPoller{Timeout: 10 * time.Second},
    })

    if err != nil {
        log.Fatal(err)
        return
    }
                    
    b.Handle("/hello", handleHello(b))

    b.Start()
}

func handleHello(b *tb.Bot) {
        b.Send(m.Sender, "Hello World!")
}

我在 m.Sender() 中的这段代码有一个错误:undefined m,由于同样的错误,我不能使用 m 作为该函数调用的参数。我不明白 m 来自哪里。

如您所见,hello 处理程序在此处采用名为 m 的参数。

b.Handle("/hello", func(m *tb.Message) {

所以你应该return一个采用相同参数的函数。

func handleHello(b *tb.Bot) func(m *tb.Message) {
    return func(m *tb.Message) {
        b.Send(m.Sender, "Hello World!")
    }
}

机器人的职责是监听一些套接字,并在消息到达关联的 path handler.

时调用您的 function handlers

因此,您不应该像 b.Handle("/hello", handleHello(b)) 那样尝试调用您的处理程序。而是将函数处理程序传递给机器人 b.Handle("/hello", handleHello)。让机器人使用新消息作为参数调用该函数,如 func(m *tb.Message).

要保留对 b 的引用,您可以按照 所述进行操作。编写一个接收机器人参数的函数,returns 一个接收消息作为参数的函数。

bot 实例 b 充当 muxer,您可以重新使用该术语来改进代码的含义。

多路复用器定义为 [...] a request multiplexer. It matches the URL of each incoming request against a list of registered patterns and calls the handler for the pattern that most closely matches the URL.

不过,我想建议您将 telebot.Bot 的实例包装到一个将消息处理程序定义为方法的类型中。

package main

import (
    "log"
    "time"

    tb "gopkg.in/tucnak/telebot.v2"
)

func main() {
    mux, err := tb.NewBot(tb.Settings{
        Token:  "TOKEN_HERE",
        Poller: &tb.LongPoller{Timeout: 10 * time.Second},
    })

    if err != nil {
        log.Fatal(err)
        return
    }

    bot := botHandlers{Bot: mux}

    mux.Handle("/hello", bot.handleHello)

    mux.Start()
}

type botHandlers struct {
    *tb.Bot
}

func (b botHandlers) handleHello(m *tb.Message) {
    b.Send(m.Sender, "Hello World!")
}

https://play.golang.org/p/6ng6WSIp8Er