Maison >développement back-end >Golang >Comment convertir correctement une tranche de chaînes en une tranche de pointeurs en chaînes en Go ?

Comment convertir correctement une tranche de chaînes en une tranche de pointeurs en chaînes en Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-19 20:22:17744parcourir

How to Correctly Convert a Slice of Strings to a Slice of Pointers to Strings in Go?

Comment convertir une tranche de chaînes en une tranche de pointeurs en chaînes

Lorsque vous travaillez avec des tranches de chaînes, il est souvent nécessaire de convertir les vers des tranches de pointeurs vers des chaînes. Cela vous permet d'accéder directement aux valeurs de chaîne sous-jacentes, plutôt que d'avoir à les déréférencer à chaque fois.

Première tentative

Une approche pour y parvenir consiste à parcourir le tranche de chaînes et ajoutez l’adresse de chaque chaîne à une nouvelle tranche. Cependant, cela ne fonctionne pas comme prévu car la variable de boucle v est affectée à chaque itération, modifiant sa valeur mais pas son adresse. En conséquence, vous vous retrouvez avec une tranche de pointeurs qui pointent tous vers la même adresse.

values1 := []string{"a", "b", "c"}
var values2 []*string
for _, v := range values1 {
    fmt.Printf("%p | %T\n", v, v)
    values2 = append(values2, &v)
}
fmt.Println(values2)
// Output:
// %!p(string=a) => string
// %!p(string=b) => string
// %!p(string=c) => string
// [0xc42000e1d0 0xc42000e1d0 0xc42000e1d0]

Solution correcte

Pour créer correctement une tranche de pointeurs aux chaînes, vous devez ajouter l'adresse de l'élément slice approprié de la tranche d'origine :

for i := range values1 {
    values2 = append(values2, &values1[i])
}

Dans ce cas, la variable de boucle i est utilisée pour index dans la tranche d'origine, en garantissant que chaque adresse ajoutée aux valeurs 2 correspond à une chaîne unique dans les valeurs 1.

Solution alternative

Une solution alternative consiste à créer des variables locales temporaires et ajoutez les adresses de ceux-ci :

for _, v := range values1 {
    v2 := v
    values2 = append(values2, &v2)
}

Cette approche est indépendante de la tranche d'origine et toute modification apportée aux valeurs1 n'affectera pas valeurs2.

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