Maison > développement back-end > Golang > Go Slices : Pourquoi la copie d'éléments de tranche à l'aide de « plage » conduit-elle parfois à des adresses de mémoire partagée ?

Go Slices : Pourquoi la copie d'éléments de tranche à l'aide de « plage » conduit-elle parfois à des adresses de mémoire partagée ?

Linda Hamilton
Libérer: 2024-12-19 02:12:09
original
484 Les gens l'ont consulté

Go Slices: Why Does Copying Slice Elements Using `range` Sometimes Lead to Shared Memory Addresses?

Go : Réutilisation de la copie d'adresses mémoire à partir d'une tranche

Dans Go, la fonction range parcourt les éléments d'une tranche. Cependant, un piège courant réside dans la réutilisation des adresses mémoire pour les variables de boucle. Cela peut conduire à des résultats inattendus lorsque vous tentez de copier des éléments de tranche dans une autre structure de données.

Considérez l'extrait de code suivant :

// Regions is the collection of the Region model
type Regions []Region

// Returns the model collection as a list of models
func (coll *Regions) ToModelList() []Model {
    output := make([]Model, len(*coll))
    for idx, item := range *coll {
        output[idx] = &item
    }
    return output
}
Copier après la connexion

Dans ce code, l'élément de variable de boucle est une référence de pointeur. à un élément de la tranche *coll. En attribuant &item aux éléments de la tranche de sortie, plusieurs éléments finissent par pointer vers le même objet Region sous-jacent. Cela se produit car output et *coll partagent la même adresse mémoire pour l'élément.

Pour résoudre ce problème, il est nécessaire de créer une copie distincte de l'objet Region pour chaque élément en sortie. Ceci peut être réalisé en utilisant l'extrait de code suivant :

// Returns the model collection as a list of models
func (coll *Regions) ToModelList() []Model {
    output := make([]Model, len(*coll))
    for idx, _ := range *coll {
        i := (*coll)[idx]
        output[idx] = &i
    }
    return output
}
Copier après la connexion

Dans ce code révisé, _ est utilisé comme variable de boucle pour la plage sur *coll. Cela garantit qu'une nouvelle copie de i est créée pour chaque itération, empêchant ainsi la réutilisation des adresses mémoire au cours des itérations de boucle.

Comprendre les nuances de la gestion de la mémoire de Go est crucial pour éviter ce type de pièges et garantir une exécution correcte du programme. .

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!

source:php.cn
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