[英]Initializing an empty array of struct type in golang
我已经初始化了一个结构:
type DayAndTime struct {
days string
time string
}
我已经初始化了这个DayAndTime
类型的空数组集:
day := []DayAndTime{}
并在其中输入一个值: day[0] = DayAndTime{"Monday", "8.00 PM"}
但它显示了一个运行时错误:
panic: runtime error: invalid memory address or nil pointer dereference
为什么会发生这种情况,可能的解决方案是什么?
编辑:它实际上是一个切片而不是一个数组。
这里你有一个零长度的切片, len
和cap
函数都将为零值切片返回 0
切片不能超出其容量增长。 尝试这样做会导致运行时恐慌,就像在切片或数组的边界之外进行索引时一样。 同样,切片不能在零以下重新切片以访问数组中较早的元素。
您可以使用容量初始化切片并使用索引分配或使用附加向切片添加值
两者都是有效代码
var day []DayAndTime
day = append(day, DayAndTime{"Monday", "8.00 PM"})
或
var day = make([]DayAndTime, 1)
day[0] = DayAndTime{"Monday", "8.00 PM"}
推荐使用 append
这是一个证明/解释答案的示例代码https://play.golang.org/p/ajsli-6Vqw
package main
import (
"fmt"
)
type DayAndTime struct {
days string
time string
}
func ZeroLength() {
var day = []DayAndTime{}
fmt.Println("Hello, playground", cap(day), len(day), day)
}
func AppendArray() {
var day = []DayAndTime{}
day = append(day, DayAndTime{"Monday", "8.00 PM"})
fmt.Println("Hello, playground", cap(day), len(day), day)
}
func SetIndex() {
var day = make([]DayAndTime, 1)
day[0] = DayAndTime{"Monday", "8.00 PM"}
fmt.Println("Hello, playground", cap(day), len(day), day)
}
func main() {
ZeroLength()
AppendArray()
SetIndex()
}
如果您打印day
的长度,您将获得0 ,因此您无法访问不存在的day[0]
。
你可以这样写: day = append(day, DayAndTime{"Monday", "8.00 PM"})
在您的示例中,这应该是正确的语法:
type DayAndTime struct {
days string
time string
}
days := []*DayAndTime{}
您要求为数组提供解决方案,但在您的代码中显示了一个切片。
foo := []string{}
t := reflect.TypeOf(foo)
fmt.Println(t.Kind()) // slice
bar := [2]string{}
tt := reflect.TypeOf(bar)
fmt.Println(tt.Kind()) // array
无论如何,......你得到了那个错误,因为 days[0] 超出了切片的范围。 Thant 实际上包含零个项目,其长度为零。 您必须使用 append,返回新切片,然后才能访问 days[0]。 或者可以用make初始化。
package main
import "fmt"
type DayAndTime struct {
days string
time string
}
func main() {
days := []DayAndTime{}
days = append(days, DayAndTime{"days ...", "time ..."})
fmt.Printf("%v", days[0].days)
}
另一种解决方案是构建一个数组而不是切片
func main() {
days := [2]DayAndTime{}
days[0].days = "fooo"
fmt.Printf("%v", days[0].days)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.