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
Libérer: 2024-12-04 22:44:11
original
568 Les gens l'ont consulté

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)
    }
}
Copier après la connexion

Sortie :

map[Allen:0xc0000a6058 Tom:0xc0000a6060]
Allen &{Allen 24}
Tom &{Tom 23}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal