我初始化了一个结构:
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
为什么会发生这种情况?什么是可能的解决方案?
编辑:它实际上是一个切片而不是数组。
答案 0 :(得分:8)
这里有一个零长度切片,len
和cap
函数都将为零值切片返回0
切片不能超出其容量。试图这样做会 导致运行时混乱,就像在a的边界之外索引时一样 切片或数组。同样,切片不能在零以下重新切片 访问数组中的早期元素。
您可以让我们初始化具有容量的切片并使用索引进行分配或使用append将值添加到切片
两者都是有效的代码
var day []DayAndTime
day = append(day, DayAndTime{"Monday", "8.00 PM"})
或
var day = make([]DayAndTime, 1)
day[0] = DayAndTime{"Monday", "8.00 PM"}
建议使用追加
以下是验证/解释答案的示例代码 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()
}
答案 1 :(得分:0)
如果您打印day
的长度,您将获得 0 ,因此您无法访问不存在的day[0]
。
您可以这样写:day = append(day, DayAndTime{"Monday", "8.00 PM"})
答案 2 :(得分:0)
这在您的示例中应该是正确的语法:
type DayAndTime struct {
days string
time string
}
days := []*DayAndTime{}
答案 3 :(得分:-1)
您要求为数组提供解决方案,但在代码中显示切片。
let days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
let result = days.reduce((r,a)=>r.concat(a.charAt(0).toLocaleUpperCase()+a.slice(1)),[]);
console.log(result)
无论如何,......你得到了那个错误,因为天[0]超出了切片的范围。 Thant实际上包含零项,其长度为零。您必须使用append,返回新切片,然后您可以访问days [0]。或者可以使用make初始化。
foo := []string{}
t := reflect.TypeOf(foo)
fmt.Println(t.Kind()) // slice
bar := [2]string{}
tt := reflect.TypeOf(bar)
fmt.Println(tt.Kind()) // array
另一个解决方案是构建一个数组而不是切片
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)
}