wake-up-neo.com

Initialisierung eines leeren Arrays des Strukturtyps in Golang

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.

3
Soumya Rauth

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"})

0
夜阑听风