如何拆分传递给telebot的Handle方法的接口类型回调参数
错误原因
- tucnak/telebot 的
b.Handle()方法第二个参数要求传入回调函数,触发/hello指令时,库会自动将当前触发的消息对象作为*tb.Message类型参数传入回调,你拆分后的handleHello没有定义该参数,自然会出现undefined m报错。 - 你直接书写
b.Handle("/hello", handleHello(b))是当场执行handleHello函数,而非将函数本身作为回调传入Handle,且返回值也不符合回调的签名要求。
正确实现
你可以让 handleHello 返回符合回调签名的闭包,既可以注入需要用到的bot实例,也能正常接收库自动传入的消息对象:
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() } // handleHello 返回符合Handle要求的回调函数 func handleHello(b *tb.Bot) func(*tb.Message) { return func(m *tb.Message) { b.Send(m.Sender, "Hello World!") } }
如果处理逻辑不需要用到bot实例,也可以直接写符合签名的回调函数,不需要闭包:
b.Handle("/hello", handleHello) func handleHello(m *tb.Message) { // 不需要调用bot方法的场景可以直接用该写法 }
内容的提问来源于stack exchange,提问作者gelerum
相关产品推荐
相关产品推荐

