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

时间:2015-11-24 11:35:28

标签: go

我的结构

type Result struct {
   name   string
   Objects []struct {
       id int
   }
}

初始化此

的值
func main() {
   var r Result;
   r.name  = "Vanaraj";
   r.Objects[0].id = 10;
   fmt.Println(r)
}

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

如何解决这个问题?

4 个答案:

答案 0 :(得分:13)

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

type MyStruct struct {
    MyField int
}

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

type Result struct {
    name   string
    Objects []MyStruct
}

你的程序恐慌的原因是你试图访问尚未分配的内存区域(Object数组中的项目)。

对于结构数组,需要使用make

r.Objects = make([]MyStruct, 0)

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

ms := MyStruct{
    MyField: 10,
}

然后append将此r.Objects数组

r.Objects = append(r.Objects, ms)

有关make的详情,请参阅the docs

答案 1 :(得分:3)

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

r.Objects = append(r.Objects, struct{ id int }{}) 

此外,您可以使用结构的初始化省略r.Objects[0].id = 10;,如下所示:

r.Objects = append(r.Objects, struct{ id int }{ 10 })

答案 2 :(得分:0)

按照another answer中的建议定义结构后:

type MyStruct struct {
    MyField int
}


type Result struct {
    Name   string
    Objects []MyStruct
}

然后,您可以像这样初始化Result对象:

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

完整代码:

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
}

您可以在此Go playground中对此进行验证。

答案 3 :(得分:0)

这可能是一个愚蠢的想法,但你可以通过 JSON 来回它:

package main

import (
   "bytes"
   "encoding/json"
)

type (
   a []interface{}
   m map[string]interface{}
)

func decode(in, out interface{}) {
   var b bytes.Buffer
   json.NewEncoder(&b).Encode(in)
   json.NewDecoder(&b).Decode(out)
}

示例:

package main
import "fmt"

type result struct {
   Name string
   Objects []struct {
      Id int
   }
}

func main() {
   r := m{
      "Name": "Vanaraj",
      "Objects": a{
         m{"Id": 10},
      },
   }
   var s result
   decode(r, &s)
   fmt.Printf("%+v\n", s) // {Name:Vanaraj Objects:[{Id:10}]}
}