如何在golang中初始化嵌套struct数组的值

van*_*jcs 12 go

我的结构

type Result struct {
   name   string
   Objects []struct {
       id int
   }
}
Run Code Online (Sandbox Code Playgroud)

初始化此值

func main() {
   var r Result;
   r.name  = "Vanaraj";
   r.Objects[0].id = 10;
   fmt.Println(r)
}
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误."恐慌:运行时错误:索引超出范围"

如何解决这个问题?

Lam*_*bda 14

按照另一个答案中的建议定义结构后:

type MyStruct struct {
    MyField int
}


type Result struct {
    Name   string
    Objects []MyStruct
}
Run Code Online (Sandbox Code Playgroud)

然后你可以Result像这样初始化一个对象:

result := Result{
    Name: "I am Groot",
    Objects: []MyStruct{
        {
            MyField: 1,
        },
        {
            MyField: 2,
        },
        {
            MyField: 3,
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

完整代码:

package main

import "fmt"

func main() {
    result := Result{
        Name: "I am Groot",
        Objects: []MyStruct{
            {
                MyField: 1,
            },
            {
                MyField: 2,
            },
            {
                MyField: 3,
            },
        },
    }

    fmt.Println(result)

}

type MyStruct struct {
    MyField int
}

type Result struct {
    Name    string
    Objects []MyStruct
}
Run Code Online (Sandbox Code Playgroud)

您可以在此Go 游乐场中验证这一点。


mat*_*sch 13

首先,我认为为结构定义类型更为惯用,无论结构有多简单.例如:

type MyStruct struct {
    MyField int
}
Run Code Online (Sandbox Code Playgroud)

这意味着将Result结构更改为如下所示:

type Result struct {
    name   string
    Objects []MyStruct
}
Run Code Online (Sandbox Code Playgroud)

程序恐慌的原因是因为您正在尝试访问Object尚未分配的内存区域(s数组中的项目).

对于结构数组,这需要完成make.

r.Objects = make([]MyStruct, 0)
Run Code Online (Sandbox Code Playgroud)

然后,为了安全地添加到您的阵列,您最好实例化一个人MyStruct,即

ms := MyStruct{
    MyField: 10,
}
Run Code Online (Sandbox Code Playgroud)

然后将append其添加到您的r.Objects阵列中

r.Objects = append(r.Objects, ms)
Run Code Online (Sandbox Code Playgroud)

有关更多信息make,请参阅文档


Ron*_*Dev 5

Objects不包含任何元素。你需要先append元素。像这样:

r.Objects = append(r.Objects, struct{ id int }{}) 
Run Code Online (Sandbox Code Playgroud)

您也可以r.Objects[0].id = 10;像这样省略使用结构的初始化:

r.Objects = append(r.Objects, struct{ id int }{ 10 })
Run Code Online (Sandbox Code Playgroud)