You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分传递给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:06:00