为了账号安全,请及时绑定邮箱和手机立即绑定

将附加参数传递给回调

将附加参数传递给回调

Go
一只甜甜圈 2022-08-01 10:46:08
我正在使用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}
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

您有 2 种选择:

  • 定义一个返回并接受结构的函数mqtt.MessageHandler

  • 在结构上定义一个方法,并使用相同的签名mqtt.MessageHandler

type 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

  // ...

}


查看完整回答
反对 回复 2022-08-01
?
精慕HU

TA贡献1845条经验 获得超8个赞

您需要从 func 返回处理程序,在需要调用其方法的结构对象周围创建一个闭包。


这是一种方法。请注意,我没有使用过lib,所以下面的主要功能可能无法编译,但你会明白:


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{})

}



查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号