如何拆分传递给方法的接口
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!")
}
我使用这个库 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
的引用,您可以按照
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!")
}