登录
首页 >  Golang >  Go问答

访问函数中无法传递的变量

来源:stackoverflow

时间:2024-03-21 13:45:31 348浏览 收藏

在 paho.mqtt 库中接收 MQTT 消息时,无法从访问函数中访问在主函数中初始化的变量。本文提供了两种解决方案: 1. 将变量提升到包级别,使之在所有函数中都可用。 2. 使用闭包将主函数的变量传递给访问函数,在访问函数中对其进行修改。

问题内容

所以我使用paho.mqtt来接收mqtt消息,接收到的消息是这样打印的

var messagepubhandler mqtt.messagehandler = func(client mqtt.client, msg mqtt.message) {
    fmt.printf("received message: %s from topic: %s\n", msg.payload(), msg.topic())
}

如果我现在需要(从该函数)访问例如在 main 中初始化的 c,我该怎么做?

opts.SetDefaultPublishHandler(messagePubHandler)
opts.OnConnect = connectHandler
opts.OnConnectionLost = connectLostHandler
client := mqtt.NewClient(opts)
d := net.Dialer{Timeout: 5000*time.Millisecond}
c, err := d.Dial("tcp", "127.0.0.1:1234")

我查看了指针,但这似乎不起作用(或者我只是不明白如何),而且我不知道如何传递 c


正确答案


提供一种使 c 处于范围内的方法。

一个示例是将其移动到包级别变量:

var c mqtt.client

func main() {
    // ...
    var err error
    c, err = d.dial("tcp", "127.0.0.1:1234")
}

那么你可以参考c

另一个解决方案是使用 main()闭包初始化 messagepubhandler

var messagePubHandler mqtt.MessageHandler

func main() {
    opts.SetDefaultPublishHandler(messagePubHandler)
    opts.OnConnect = connectHandler
    opts.OnConnectionLost = connectLostHandler
    client := mqtt.NewClient(opts)
    d := net.Dialer{Timeout: 5000*time.Millisecond}
    c, err := d.Dial("tcp", "127.0.0.1:1234")

    messagePubHandler = func(client mqtt.Client, msg mqtt.Message) {
        fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())
        // Here you can access c
    } 
}

到这里,我们也就讲完了《访问函数中无法传递的变量》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>