Conversion d'une tranche de chaînes en tranche de pointeurs en chaînes
Le but de cette tâche est de transformer une tranche de chaînes en une tranche contenant pointeurs vers chacune de ces chaînes. Examinons un exemple spécifique :
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)
Confusion initiale
Il peut sembler contre-intuitif que v, bien qu'il s'agisse d'une chaîne, reste à la même adresse mémoire tout au long de la boucle . En effet, dans ce cas, v n'est pas un pointeur vers une chaîne, mais plutôt une copie de chaque chaîne dans valeurs1.
Deux solutions possibles
Solution 1 :
for i, _ := range values1 { values2 = append(values2, &values1[i]) }
Cette méthode ajoute correctement des pointeurs vers les éléments de la tranche valeurs1 d'origine aux valeurs2. Cependant, il est important de noter que valeurs2 contient désormais des adresses pointant directement vers valeurs1, donc valeurs1 restera en mémoire tant que valeurs2 existera.
Solution 2 :
for _, v := range values1 { v2 := v values2 = append(values2, &v2) }
Cette solution alternative crée une variable locale temporaire (v2) pour chaque itération, lui attribue la valeur de v, puis ajoute un pointeur vers v2 aux valeurs2. Cela garantit que valeurs1 est indépendante de valeurs2 et que toute modification apportée à 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!