Maison >développement back-end >Golang >Pourquoi les boucles Go Slice Range créent-elles des adresses partagées lors du mappage de structures ?
Dans Go, les tranches sont une structure de données puissante qui peut être itérée plutôt que d'utiliser le mot-clé range. Cependant, dans un phénomène particulier, lors d'une itération sur une tranche de structures à l'aide d'une plage for, les éléments de la carte résultante partagent la même adresse. Ce comportement peut prêter à confusion, d'autant plus que les éléments de la tranche d'origine doivent avoir des adresses uniques.
La clé pour comprendre ce phénomène réside dans la manière dont les variables sont stockés en mémoire. Lors de l'accès à un élément de la tranche dans la boucle for-range (stu dans ce cas), la variable locale stu contient une copie de la structure. L'attribution du pointeur à la variable locale pointe efficacement tous les éléments de la carte vers la même copie de la structure en mémoire.
Pour résoudre ce problème et attribuer les adresses des éléments slice, le code doit être modifié pour prendre l'adresse de l'élément slice lui-même. En utilisant s[i] au lieu de stu, le pointeur vers l'élément réel dans la tranche est attribué à la carte.
package main import "fmt" type student struct { Name string Age int } func main() { m := make(map[string]*student) s := []student{ {Name: "Allen", Age: 24}, {Name: "Tom", Age: 23}, } for i := range s { m[s[i].Name] = &s[i] // Change here } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } }
Sortie :
map[Allen:0xc0000a6058 Tom:0xc0000a6060] Allen &{Allen 24} Tom &{Tom 23}
En comprenant le comportement sous-jacent de gestion de la mémoire, nous pouvons résoudre ce phénomène de plage de tranches dans Go. En prenant l'adresse de l'élément slice lui-même, nous garantissons que chaque élément de la carte pointe vers une structure unique en mémoire, préservant ainsi l'intégrité des données.
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!