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!