我初始化了一个结构:
type DayAndTime struct {
days string
time string
}
Run Code Online (Sandbox Code Playgroud)
我已经初始化了一个这种DayAndTime
类型的空数组:
day := []DayAndTime{}
Run Code Online (Sandbox Code Playgroud)
并在其中加入一个值:
day[0] = DayAndTime{"Monday", "8.00 PM"}
但它显示运行时错误:
panic: runtime error: invalid memory address or nil pointer dereference
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?什么是可能的解决方案?
编辑:它实际上是一个切片而不是一个数组.
Sar*_*lai 12
这里有一个零长度切片,len
并且cap
函数将为零值切片返回0
切片不能超出其容量.尝试这样做会导致运行时出现混乱,就像在切片或数组的边界之外进行索引一样.类似地,切片不能在零以下重新切片以访问数组中的早期元素.
您可以使用容量初始化切片并使用索引进行分配或使用append将值添加到切片
两者都是有效的代码
var day []DayAndTime
day = append(day, DayAndTime{"Monday", "8.00 PM"})
Run Code Online (Sandbox Code Playgroud)
要么
var day = make([]DayAndTime, 1)
day[0] = DayAndTime{"Monday", "8.00 PM"}
Run Code Online (Sandbox Code Playgroud)
推荐使用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()
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13834 次 |
最近记录: |