我的结构
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)
}
我收到了这个错误。 "恐慌:运行时错误:索引超出范围"
如何解决这个问题?
答案 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}]}
}