自动创建结构实例

时间:2018-08-09 17:48:43

标签: go struct

我正在运行一段通过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,我也无法返回**VirtualDevice。我该如何退货?我要实现的目标是否正确? (使用每个传入的JSON创建具有相同结构的新实例,并向每个实例附加一个指针,以免丢失数据)

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

1 个答案:

答案 0 :(得分:0)

您的函数无法返回**VirtualDevice,因为类型的范围是该函数。将type定义移到func之外。如果已经在外部定义了它们,只需删除它们即可。

此外,我认为您可能对指针有些困惑。 new(VirtualDevice)返回指向新创建的VirtualDevice的指针(因此您的sensorData的类型为*VirtualDevice)。当您使用&sensorData时,您将获得该指针的指针。您通常不需要这样做。您可以将&传递给json.Unmarshal和返回,并更改返回类型。