我有一段代码可以接收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。为什么会这样呢?
答案 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
,这是您放弃数据之前等待数据的最长时间。