Go 自动创建结构的实例

Go 自动创建结构的实例,go,struct,Go,Struct,我正在运行一段通过MQTT接收JSON的代码。每次我收到一个JSON(MQTT总是在运行),我都想创建一个我拥有的结构的实例。我还想将该实例附加到一个列表中,以跟踪我拥有的实例数量 以下是我到目前为止的情况: func VirtualDevice(client MQTT.Client, deviceID string) **VirtualDevice { type Device struct{ Type string `json:"type"`

我正在运行一段通过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])
如您所见,我无法返回
&传感器
,即使它的类型是
**VirtualDevice
。我怎样才能回报这一点?我是否在正确的轨道上实现了我想要实现的目标?(使用每个传入的JSON创建同一结构的新实例,并向每个实例附加一个指针以避免丢失数据)


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

您的函数无法返回
**VirtualDevice
,因为类型的作用域是函数。将
类型
定义移到
func
之外。如果它们已经在外部定义,只需删除它们


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

不确定这里的问题是什么-基本语法在Go Tour中有详细介绍:您创建的结构类型值与您在代码的任何其他部分中创建的值相同。我真的不确定你在问什么,因为你展示的唯一一段代码是
if
语句,结构初始化在。如果你是新来的,你应该参加整个旅行。如果我不清楚,对不起。我知道如何创建结构的实例。但我希望这样,每当我收到消息时,就会自动创建一个结构。我应该分配内存并在列表中的结构上附加一个点吗?这是编程,不是魔术。没有什么事情是自动发生的。作为程序员,您必须确定在什么情况下发生了什么。现在,“发生了什么”还不够清楚,无法编写任何代码。因此,当您“收到一个JSON”时,您将调用一些代码来创建一个结构@Peter已经为您提供了创建结构的新实例的语法。为什么不能接受?你到底想发生什么?谢谢。我还试图将指向VirtualDevice结构的指针附加到一个指针片中。然而,当我打印出该片段的第一个元素时,我得到了一个空的JSON。你知道为什么吗?
fmt.Println
不打印JSON。它通过各种方式将值转换为字符串。默认情况下,指针打印为内存地址。在您的示例中,我没有看到VD类型,但是您可以尝试添加一个
func(VD*VD)String()字符串,看看这是否会更改您的输出。它当前打印出以下内容:
{{}{[]{}}
问题是它在填充任何信息之前打印出来。有没有办法让程序在我的第二个文件中暂停?