Ich habe eine Struktur initialisiert:
type DayAndTime struct {
days string
time string
}
Ich habe ein leeres Array von diesem DayAndTime
-Typ initialisiert:
day := []DayAndTime{}
Und geben Sie einen Wert ein: day[0] = DayAndTime{"Monday", "8.00 PM"}
Es zeigt jedoch einen Laufzeitfehler:
panic: runtime error: invalid memory address or nil pointer dereference
Warum passiert das und was könnte eine mögliche Lösung sein?
edit: Es ist eigentlich ein Slice, kein Array.
Hier haben Sie ein Slice der Länge Null, die Funktionen len
und cap
geben beide 0 für ein Slice mit Nullwert zurück
Eine Scheibe kann nicht über ihre Kapazität hinaus wachsen. Wenn Sie dies versuchen, führt Zu einer Laufzeitpanik, genau wie bei der Indexierung außerhalb der Grenzen eines Slice oder Arrays. In ähnlicher Weise können Slices nicht unter Null umgeschnitten werden, um auf Frühere Elemente im Array zugreifen zu können.
Sie können das Slice mit Kapazität initialisieren und Index zuweisen oder mit append Werte zum Slice hinzufügen
Beide sind gültiger Code
var day []DayAndTime
day = append(day, DayAndTime{"Monday", "8.00 PM"})
oder
var day = make([]DayAndTime, 1)
day[0] = DayAndTime{"Monday", "8.00 PM"}
Die Verwendung von Append wird empfohlen
Hier ist ein Beispielcode, der die Antwort begründet/erklärt. 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()
}
Wenn Sie die Länge von day
drucken, erhalten Sie 0 , sodass Sie nicht auf day[0]
zugreifen können, der nicht vorhanden ist.
Sie können es so schreiben: day = append(day, DayAndTime{"Monday", "8.00 PM"})