Maison >développement back-end >Golang >Pourquoi la boucle Slice Range de Go crée-t-elle un comportement inattendu lorsqu'elle est utilisée avec des cartes ?
Décodage du comportement de la plage de tranches de Go
Dans Go, les tranches sont une structure de données polyvalente qui offre une fonctionnalité dynamique de type tableau. Lors d’une itération sur une tranche, la syntaxe range fournit un moyen pratique d’accéder à ses éléments. Cependant, certains scénarios peuvent conduire à un comportement inattendu.
Considérez le code suivant qui crée une tranche de structures d'étudiant et remplit une carte avec des références à ces structures :
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 _, stu := range s { m[stu.Name] = &stu } fmt.Println(m) // map[Allen:0xc42006a0c0 Tom:0xc42006a0c0] }
Le comportement attendu est que la carte doit contenir des références à chaque structure d'étudiant individuelle dans la tranche. Cependant, le résultat montre que les deux clés de la carte pointent vers la même adresse.
Ce comportement peut s'expliquer en comprenant que la variable stu dans la boucle range est une copie de l'élément slice, pas une référence. Le stu.Name récupère une copie du champ de nom et &stu prend l'adresse de la copie, ce qui donne la même adresse pour toutes les valeurs de la carte.
Pour corriger ce problème, le code doit prendre l'adresse du élément slice réel à la place :
for i := range s { m[s[i].Name] = &s[i] }
En accédant directement à l'élément slice, nous obtenons une référence à son emplacement mémoire unique, résolvant le comportement inattendu et garantissant que la carte contient des références à chaque élève structure.
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!