Maison >développement back-end >Golang >Comment modifier les champs structurels dans Maps in Go ?

Comment modifier les champs structurels dans Maps in Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-06 20:23:13406parcourir

How to Modify Struct Fields in Maps in Go?

Attribution de champs de structure dans Maps

Lorsque vous travaillez avec des cartes dans Go, il est crucial de comprendre les implications de l'affectation de champs de structure dans ces champs. des cartes. L'erreur « Impossible d'attribuer au champ struct dans une carte » se produit lorsqu'une tentative est faite pour modifier directement un champ struct d'une valeur stockée dans une carte. Cette erreur se produit en raison de la façon dont les cartes sont implémentées dans Go.

Dans Go, une carte est une collection de paires où le type de clé est comparable et le type d'élément peut être n'importe quel type, y compris les structures. Cependant, lorsqu'une valeur de structure est placée dans une carte en tant qu'élément, elle ne conserve pas son adressabilité. Cela signifie que les tentatives de modification de ses champs comme s'il s'agissait d'un pointeur déclencheront l'erreur susmentionnée.

Considérez le code suivant :

type Snapshot struct {
  Key   string
  Users []Users
}

snapshots := make(map[string] Snapshot, 1)

// Initialization
snapshots["test"] = Snapshot {
  Key: "testVal",
  Users: make([]Users, 0),
}

Maintenant, une tentative d'ajout de nouveaux utilisateurs au Les utilisateurs découpent la valeur de l'instantané stockée dans la carte entraînent l'erreur redoutée :

snapshots["test"].Users = append(snapshots["test"].Users, user)

Pour surmonter ce défi, il existe deux solutions viables : solutions :

Méthode 1 :

Avant la modification, créez une copie locale de la valeur de structure stockée dans la carte, puis réaffectez l'entrée de la carte avec la copie modifiée :

tmp := snapshots["test"]
tmp.Users = append(tmp.Users, user)
snapshots["test"] = tmp

Méthode 2 :

Alternativement, définir la carte avec un type de pointeur, qui permet de modifier les champs de structure :

snapshots := make(map[string] *Snapshot, 1)

// Initialization
snapshots["test"] = &Snapshot {
  Key: "testVal",
  Users: make([]Users, 0),
}

snapshots["test"].Users = append(snapshots["test"].Users, user) est maintenant valide et ne rencontrera pas l’erreur. Cependant, il est important de noter que la deuxième solution peut avoir des implications sur la gestion de la mémoire et doit être utilisée avec prudence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn