Maison >développement back-end >Golang >Pourquoi les itérations de plage de tranches dans Go renvoient-elles parfois des copies au lieu d'adresses ?
Comprendre le phénomène des plages de tranches dans Go
Dans Go, le comportement des plages de tranches peut prêter à confusion. Lors d'une itération sur une tranche à l'aide d'une clause range, il est tentant de croire que la variable d'itération contient l'adresse de chaque élément. Cependant, ce n’est pas toujours le cas. Un de ces scénarios est celui où vous travaillez avec des structures et des cartes.
Considérez le code suivant :
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 } }
Ce code parcourt une tranche de structures, ajoute une paire clé-valeur à une carte pour chaque structure et stocke l'adresse de la structure comme valeur. Cependant, la carte résultante montre que toutes les valeurs pointent vers la même adresse.
Pour expliquer ce phénomène, nous devons examiner l'implémentation sous-jacente des plages de tranches. Lorsqu'une tranche est itérée à l'aide d'une clause range, la variable d'itération reçoit une copie de l'élément de la tranche. Ainsi, la variable d'itération contient une copie de la structure, pas son adresse.
Pour résoudre ce problème et stocker l'adresse de la structure dans la carte, le code doit être modifié pour prendre l'adresse de l'élément slice :
for i := range s { m[s[i].Name] = &s[i] }
Ce changement garantit que la variable d'itération contient l'adresse de la structure et que la carte stockera correctement les adresses de chaque structure dans la tranche.
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!