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 ?

Pourquoi les itérations de plage de tranches dans Go renvoient-elles parfois des copies au lieu d'adresses ?

DDD
DDDoriginal
2024-12-05 15:54:14215parcourir

Why Do Slice Range Iterations in Go Sometimes Return Copies Instead of Addresses?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn