猿问

将附加参数传递给回调

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


现在我想订阅一个主题,为此我需要传递一个带有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

}


一只甜甜圈
浏览 108回答 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  // ...}

精慕HU

您需要从 func 返回处理程序,在需要调用其方法的结构对象周围创建一个闭包。这是一种方法。请注意,我没有使用过lib,所以下面的主要功能可能无法编译,但你会明白: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

相关分类

Go
我要回答