将附加参数传递给回调

我正在使用 phao mqtt 模块与 mqtt 服务器进行通信。


现在我想订阅一个主题,为此我需要传递一个带有 type 的回调MessageHandler。是否可以将附加参数传递给MessageHandler?


到目前为止,我的处理程序看起来像这样:


var MyMessageHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {

    fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())

    # Call here a stuct method

}


撒科打诨
浏览 169回答 2
2回答

狐的传说

您有 2 个选项:定义一个返回mqtt.MessageHandler并接受你的结构的函数在您的结构上定义一个方法和相同的签名mqtt.MessageHandlertype S struct{}func MessageHandler(s S) mqtt.MessageHandler {  return func(client mqtt.Client, msg mqtt.Message) {    // use `s`    // ...  }}func (s *S) MessageHandler(client mqtt.Client, msg mqtt.Message) {  // use `s`  // ...}用法:func main() {  s := S{}  mh := MessageHandler(s)  mh = s.MessageHandler // same type  // use mh  // ...}

慕妹3146593

您需要从 func 返回处理程序,围绕需要调用的结构对象创建一个闭包。这是一种方法。请注意,我没有使用 lib,所以下面的 main func 可能无法编译,但你会明白的:package mainimport (    "fmt")type SomeStruct struct{}func (ss *SomeStruct) Invoke() {    fmt.Println("struct method called")}func GetHandler(s *SomeStruct) mqtt.MessageHandler {    return func(client mqtt.Client, msg mqtt.Message) {        fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())        s.Invoke()    }}func main() {    handler := GetHandler(&SomeStruct{})    //pass to lib or assume it is invoked by lib    //handler(Client{}, Message{})}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go