Go 将附加参数传递给回调函数

Go 将附加参数传递给回调函数,go,Go,我正在使用phao mqtt模块与mqtt服务器通信 现在我想订阅一个主题,为此我需要一个类型为的回调。是否可以通过某种方式将附加参数传递给MessageHandler 到目前为止,我的处理程序如下所示: var MyMessageHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) { fmt.Printf("Received message: %s from topic: %s\n&

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

现在我想订阅一个主题,为此我需要一个类型为的回调。是否可以通过某种方式将附加参数传递给
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
}

您需要从func返回处理程序,围绕需要调用的方法的struct对象创建闭包

这里有一个方法可以做到这一点。请注意,我没有使用lib,因此下面的main func可能无法编译,但您会明白这一点:

package main

import (
    "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{})
}

您需要从func返回处理程序,围绕需要调用的方法的struct对象创建闭包

这里有一个方法可以做到这一点。请注意,我没有使用lib,因此下面的main func可能无法编译,但您会明白这一点:

package main

import (
    "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{})
}
您有两种选择:

  • 定义一个返回
    mqtt.MessageHandler
    并接受结构的函数
  • 在结构上定义一个方法,并使用相同的签名
    mqtt.MessageHandler
类型S结构{}
func MessageHandler(s)mqtt.MessageHandler{
return func(client mqtt.client,msg mqtt.Message){
//使用's`
// ...
}
}
func(s*s)MessageHandler(客户机mqtt.client,消息mqtt.Message){
//使用's`
// ...
}
用法:

func main(){
s:=s{}
mh:=消息处理程序
mh=s.MessageHandler//相同类型
//使用mh
// ...
}
您有两个选项:

  • 定义一个返回
    mqtt.MessageHandler
    并接受结构的函数
  • 在结构上定义一个方法,并使用相同的签名
    mqtt.MessageHandler
类型S结构{}
func MessageHandler(s)mqtt.MessageHandler{
return func(client mqtt.client,msg mqtt.Message){
//使用's`
// ...
}
}
func(s*s)MessageHandler(客户机mqtt.client,消息mqtt.Message){
//使用's`
// ...
}
用法:

func main(){
s:=s{}
mh:=消息处理程序
mh=s.MessageHandler//相同类型
//使用mh
// ...
}

当消息处理程序中的某些内容被这样定义时,您可以使用闭包来使用或调用它。您可以使用闭包在消息处理程序中使用或调用这样定义的内容。