我的结构
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
,请参阅文档
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)