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 : 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 }
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 }
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!