web-dev-qa-db-fra.com

Golang: J'ai une carte des structures. Pourquoi ne puis-je pas modifier directement un champ dans une valeur de structure?

Pourquoi devons-nous d'abord lire la structure, la modifier, puis la réécrire sur la carte? Suis-je absent d'une sorte de coût caché implicite dans la modification des champs de structures dans d'autres structures de données (comme une carte ou une tranche)?

Edit: je me rends compte que je peux utiliser des pointeurs, mais pourquoi n'est-ce pas autorisé par Go?

type dummy struct {
    a int
}
x := make(map[int]dummy)
x[1] = dummy{a:1}
x[1].a = 2
11
kanu

Vous stockez une structure par valeur, ce qui signifie que l'accession de cette structure dans la carte vous donne une copie de la valeur. C'est pourquoi lorsque vous le modifiez, la structure de la carte reste non mutée jusqu'à ce que vous la remplaciez par la nouvelle copie.

Comme RickyA l'a souligné dans le commentaire, vous pouvez stocker le pointeur sur la structure à la place, ce qui permet une modification directe de la structure référencée par le pointeur de structure stocké.

c'est à dire. map[whatever]*struct au lieu de map[whatever]struct

15
Corvus Crypto