我正在运行一段通过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。我究竟做错了什么?
答案 0 :(得分:0)
您的函数无法返回**VirtualDevice
,因为类型的范围是该函数。将type
定义移到func
之外。如果已经在外部定义了它们,只需删除它们即可。
此外,我认为您可能对指针有些困惑。 new(VirtualDevice)
返回指向新创建的VirtualDevice
的指针(因此您的sensorData
的类型为*VirtualDevice
)。当您使用&sensorData
时,您将获得该指针的指针。您通常不需要这样做。您可以将&
传递给json.Unmarshal
和返回,并更改返回类型。