Maison >développement back-end >Golang >Pourquoi les boucles Go Slice Range créent-elles des adresses partagées lors du mappage de structures ?

Pourquoi les boucles Go Slice Range créent-elles des adresses partagées lors du mappage de structures ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-04 22:44:11552parcourir

Why Do Go Slice Range Loops Create Shared Addresses When Mapping Structs?

Comprendre le phénomène de la gamme Go Slice

Problème : le mystérieux comportement de la gamme Slice

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.

Explication : le piège des variables locales

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.

Résoudre le problème : transmettre les adresses des éléments de tranche

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.

Exemple : Démonstration de la solution

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}

Conclusion

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!

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
Article précédent:Utiliser CloudEvents dans GoArticle suivant:Utiliser CloudEvents dans Go