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
Libérer: 2024-12-06 20:23:13
original
380 Les gens l'ont consulté

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),
}
Copier après la connexion

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)
Copier après la connexion

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
Copier après la connexion

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),
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal