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

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

Patricia Arquette
Patricia Arquetteoriginal
2024-12-14 20:38:19570parcourir

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

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!

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