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!