3 votes

Comment ajouter une structure à un tableau de structures en Go ?

Dans golang, j'essaie de créer un tableau de messages, et la possibilité d'ajouter facilement un nouvel "objet" au tableau.

type Message struct {
    Name string
    Content string
}

var Messages = []Message{
    {
        Name: "Alice",
        Content: "Hello Universe",
    },{
        Name: "Bob",
        Content: "Hello World",
    },
}

func addMessage(m string) {
    var msg = new(Message)
    msg.Name = "Carol"
    msg.Content = m
    Messages = append(Messages, msg)
}

Lors de la construction, j'obtiens une erreur qui dit :

impossible d'utiliser msg (type *Message) comme type Message dans append

Pourquoi est-ce que append() ne fonctionne pas (comme on peut s'y attendre de la part de JavaScript). array.concat() ), ou est new() ne fonctionne pas ?

Tout autre conseil sur la façon d'améliorer ce code est le bienvenu puisque je suis manifestement novice en matière de Go.

4voto

sberry Points 28742

Changez ces 3 lignes

var msg = new(Message)
msg.Name = "Carol"
msg.Content = m

à

msg := Message{
    Name:    "Carol",
    Content: m,
}

et tout devrait fonctionner. new crée un pointeur vers Message . Votre tranche n'est pas une tranche de pointeurs Message, mais une tranche de Messages.

2voto

abhink Points 4753

Dans votre code, Messages est une tranche de Message et vous essayez d'ajouter un pointeur de type Message type ( *Message ) à celui-ci.

Vous pouvez corriger votre programme en procédant comme suit :

func addMessage(m string) {
    var msg = new(Message) // return a pointer to msg (type *msg)
    msg.Name = "Carol"
    msg.Content = m
    Messages = append(Messages, *msg) // use the value pointed by mgs
}

Alternativement, vous pouvez déclarer Messages comme une tranche de *Message :

var Messages = []*Message{
    &Message{ // Now each entry must be an address to a Message struct
        Name: "Alice",
        Content: "Hello Universe",
    },
    &Message{
        Name: "Bob",
        Content: "Hello World",
    },
}

Dans le cas ci-dessus, addMessage ne nécessiterait aucun changement. Mais vous devrez modifier Messages l'accès partout ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X