将指向结构片的指针附加为空

时间:2018-08-10 15:54:05

标签: pointers go struct

我有一段代码可以接收JSON,并根据其deviceID创建一个结构实例。

type Ctrl struct {
    Instance []*VD
}
var device *VD
if integrationResult == "successful"{
    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]) //nothing is in here
}

在另一个文件中,我有:

type Device struct{
    Type        string `json:"type"`
    Value       []interface{} `json:"value"`
    CaptureTime string   `json:"capture-time"`
}

type VD 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"`
}
func VirtualDevice(client MQTT.Client, deviceID string) *VD {
    sensorData := new(VD)

    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
}

我遇到的问题是*sensorList.Instance[0]打印出一个空的JSON。为什么会这样呢?

1 个答案:

答案 0 :(得分:2)

返回数据之前,您不必等待sensorData实际被数据填充,因此您将返回一个空结构。您可以等待

token := client.Subscribe("data-update/" + deviceID, 0, g)
token.wait()
if token.Error() != nil {
    // do something useful here
}
return sensorData

您还可以使用WaitTimeout来指定time.Duration,这是您放弃数据之前等待数据的最长时间。