私は構造体を初期化しました:
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を返します
スライスは、その容量を超えて拡張することはできません。これを実行しようとすると、スライスまたは配列の境界外でインデックスを作成する場合と同様に、ランタイムパニックが発生します。同様に、スライスをゼロ未満に再スライスして、配列内の以前の要素にアクセスすることはできません。
容量でスライスを初期化してインデックスで割り当てるか、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()
}
day
の長さを出力すると、が返されるため、存在しない_day[0]
_にアクセスできません。
このように書くことができます:day = append(day, DayAndTime{"Monday", "8.00 PM"})