gpt4 book ai didi

go - 如何拆分传递给方法的接口(interface)

转载 作者:行者123 更新时间:2023-12-05 04:44:37 26 4
gpt4 key购买 nike

我使用这个库 tucnak/telebot构建 Telegram Bot 。

方法 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!")
}

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

最佳答案

机器人的职责是监听一些套接字,并在消息到达相关的路径处理程序时调用您的函数处理程序

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

要保留对 b 的引用,您可以按照 Sinan Coment 中的描述进行操作.编写一个接受机器人参数的函数,并返回一个接收消息作为参数的函数。

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

多路复用器定义为[...] 请求多路复用器。它将每个传入请求的 URL 与已注册模式列表进行匹配,并为与 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

关于go - 如何拆分传递给方法的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69333827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com