Go 将附加参数传递给回调函数
我正在使用phao mqtt模块与mqtt服务器通信 现在我想订阅一个主题,为此我需要一个类型为的回调。是否可以通过某种方式将附加参数传递给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&
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
// ...
}
当消息处理程序中的某些内容被这样定义时,您可以使用闭包来使用或调用它。您可以使用闭包在消息处理程序中使用或调用这样定义的内容。