web-dev-qa-db-fra.com

Initialiser un tableau vide de type struct dans golang

J'ai initialisé une structure: 

type DayAndTime struct {
    days string
    time string
  }

J'ai initialisé un ensemble vide de tableau de ce type DayAndTime:

day := []DayAndTime{}

Et mettez-y une valeur: day[0] = DayAndTime{"Monday", "8.00 PM"}

Mais cela montre une erreur d'exécution:

panic: runtime error: invalid memory address or nil pointer dereference

Pourquoi est-ce arrivé et quelle pourrait être une solution possible?

edit: C'est en fait une tranche pas un tableau.

3
Soumya Rauth

Ici vous avez une tranche de longueur nulle, les fonctions len et cap renverront toutes les deux 0 pour une tranche de valeur zéro 

Une tranche ne peut pas être développée au-delà de sa capacité. Si vous tentez de le faire, Provoquera une panique à l'exécution, comme lors de l'indexation en dehors des limites d'une tranche ou d'un tableau De la même manière, les tranches ne peuvent pas être découpées de nouveau en dessous de zéro pour accéder aux éléments les plus anciens du tableau.

Vous pouvez nous faire pour initialiser la tranche avec capacité et assigner avec index ou utiliser append pour ajouter des valeurs à la tranche 

Les deux sont un code valide

var day []DayAndTime
day = append(day, DayAndTime{"Monday", "8.00 PM"})

ou

var day = make([]DayAndTime, 1)
day[0] = DayAndTime{"Monday", "8.00 PM"}

Utiliser append est recommandé

Voici un exemple de code justifiant/expliquant la réponse 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()
}
7

Si vous imprimez la longueur de day, vous obtiendrez 0 , vous ne pourrez donc pas accéder à day[0], qui n'existe pas.

Vous pouvez l'écrire de cette manière: day = append(day, DayAndTime{"Monday", "8.00 PM"})

0
夜阑听风