web-dev-qa-db-ja.com

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

なぜこれが起こっているのでしょうか?

編集:それは実際には配列ではなくスライスです。

7
Soumya Rauth

ここに長さゼロのスライスがあり、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"})

0
夜阑听风