自动创建结构实例

我正在运行一段通过MQTT接收JSON的代码。每次收到JSON(MQTT始终在运行)时,我想创建一个结构实例。我还想将该实例追加到列表中,以跟踪我拥有的实例数量。


这是我到目前为止的内容:


func VirtualDevice(client MQTT.Client, deviceID string) **VirtualDevice {

    type Device struct{

        Type        string `json:"type"`

        Value       []interface{} `json:"value"`

        CaptureTime string   `json:"capture-time"`

    }

    type VirtualDevice struct {

        Passport struct {

            MessageTopic string `json:"message-topic"`

            PrivateKey   string `json:"private-key"`

        } `json:"passport"`

        Data struct {

            Sensor []Device `json:"sensor"`

            Actuator struct {

            } `json:"actuator"`

        } `json:"data"`

    }


    sensorData := new(VirtualDevice)


    var g MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {

        err := json.Unmarshal(msg.Payload(), &sensorData)

        if err != nil {

            panic(err)

        } else {

            fmt.Printf("%+v\n", sensorData) //data_update    

        }

    }

    client.Subscribe("data-update/" + deviceID, 0, g)

    return &sensorData //Error: Cannot use &sensorData (type **VirtualDevice) as type **VirtualDevice

}

在另一个文件中,我有这个:


type Ctrl struct {

    Instance []*VD

}   

var device *VD

if len(sensorList.Instance) == 0 {

            device = VirtualDevice(client, deviceID)

            oldDeviceID = deviceID

            sensorList.Instance = append(sensorList.Instance, device)

        }else if oldDeviceID != deviceID{

            device = VirtualDevice(client, deviceID)

            sensorList.Instance = append(sensorList.Instance, device)


        }

        fmt.Println(*sensorList.Instance[0])

如您所见,&sensor即使它是type ,我也无法返回**VirtualDevice。我该如何退货?我要实现的目标在正确的轨道上吗?(使用每个传入的JSON创建具有相同结构的新实例,并向每个实例附加一个指针,以免丢失数据)


编辑:我能够成功返回该结构,但是当我打印出来时,*sensorList.Instance[0]我得到一个空的JSON。我究竟做错了什么?



梦里花落0921
浏览 233回答 1
1回答

扬帆大鱼

您的函数无法返回a,**VirtualDevice因为类型的范围是该函数。将type定义移到之外func。如果它们已在外部定义,则将其删除。另外,我认为您可能对指针有些困惑。new(VirtualDevice)返回指向新创建的的指针VirtualDevice(因此您sensorData的类型为*VirtualDevice)。当您使用时,&sensorData您将获得该指针的指针。您通常不需要这样做。您可以不将其&传递给json.Unmarshalreturn并更改返回类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go