Maison > développement back-end > Golang > Comment conserver les adresses mémoire d'origine lors de la conversion d'une tranche de chaînes Go en une tranche de pointeurs de chaîne ?

Comment conserver les adresses mémoire d'origine lors de la conversion d'une tranche de chaînes Go en une tranche de pointeurs de chaîne ?

Patricia Arquette
Libérer: 2024-12-26 11:09:14
original
439 Les gens l'ont consulté

How to Preserve Original Memory Addresses When Converting a Go Slice of Strings to a Slice of String Pointers?

Préservation de l'adresse de l'identifiant dans la conversion de tranche

Dans Go, convertir une tranche de chaînes (valeurs1) en une tranche de pointeurs vers des chaînes (valeurs2 ) présente un défi unique. Le code fourni ci-dessous illustre le problème :

values1 := []string{"a", "b", "c"}
var values2 []*string
for _, v := range values1 {
    fmt.Printf("%p | %T\n", v, v)
    values2 = append(values2, &v)
}
Copier après la connexion

De façon attendue, le résultat révèle que chaque élément de valeurs2 pointe vers la même adresse mémoire, bien qu'il ait des valeurs différentes. Cela se produit car la variable de boucle de plage v est une copie de la valeur de chaîne d'origine, et non un pointeur vers celle-ci. Par conséquent, v reste une valeur de chaîne, même lorsqu'une nouvelle valeur lui est attribuée dans la boucle.

Mise en œuvre de la solution

Pour résoudre ce problème, nous devons ajouter l'adresse des éléments de tranche d'origine aux valeurs2. Voici deux solutions possibles :

1. Indexation de la tranche d'origine

for i, _ := range values1 {
    values2 = append(values2, &values1[i])
}
Copier après la connexion

En accédant aux éléments de tranche via l'indexation, nous obtenons les adresses de pointeur souhaitées et préservons leurs valeurs distinctes.

2. Utilisation de variables temporaires

for _, v := range values1 {
    v2 := v
    values2 = append(values2, &v2)
}
Copier après la connexion

Dans cette approche, nous déclarons une variable temporaire (v2) pour contenir chaque valeur de chaîne. En attribuant v2 à &v2, nous créons une valeur de pointeur indépendante qui garantit que valeurs2 contient des pointeurs uniques.

Implications de la préservation de l'adresse de l'identifiant

Il est important de noter que la préservation de l'identifiant adresses a certaines implications :

  • Le tableau de sauvegarde des valeurs1 est conservé en mémoire tant que les deux valeurs1 et les valeurs2 sont accessibles.
  • Les modifications apportées aux éléments de valeurs1 seront reflétées dans les valeurs2.
  • Pour éviter que les valeurs1 ne soient récupérées, utilisez l'indexation ou des variables temporaires, comme décrit dans les solutions ci-dessus.

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