gpt4 book ai didi

go - 自动创建结构实例

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:16 26 4
gpt4 key购买 nike

我正在运行一段通过 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。我究竟做错了什么?

最佳答案

您的函数不能返回 **VirtualDevice,因为该类型仅限于函数。将 type 定义移到 func 之外。如果它们已经在外部定义,只需删除它们。

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

关于go - 自动创建结构实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com