Faire une copie d'une structure dans Go

Une variable struct dans Go peut être copiée dans une autre variable très facilement à l'aide de l'instruction d'affectation:

package main

import ( “fmt” )

type Dog struct { age int name string }

func main() { roger := Dog{5, “Roger”} mydog := roger if roger == mydog { fmt.Println(“Roger and mydog are equal structs”) } }

jouer

mydogetrogersont deux variables distinctes, mais en les comparant propriété par propriété, elles sont exactement les mêmes.

Nous pouvons maintenant modifier toutes les propriétés de ces variables sans affecter l'autre objet, car leDogstruct contient des types de base, qui sont copiés par valeur.

Si nous avions un type de référence dans notre structure, ce n'était pas si simple, car lepointerserait copié, pas la valeur, donc cela aurait été uncopie superficielle.

Par exemple

type Cat struct {
    age int
    name string
    friends []string
}

La liste des amis de notre chat est une tranche, un type de référence (avec des pointeurs, des cartes, des fonctions et des canaux), donc si vous aviez un objet chat et que vous le copiez comme nous l'avons fait pour l'exemple Dog ci-dessus, vous ne pourriez pas modifier la propriété friends sans affecter également l'autre objet.

UNEcopie profondeest nécessaire.

Copie profonde d'une structure

Vous pouvez effectuer une telle copie approfondie manuellement. Dans le cas d'une tranche, vous pouvez effectuer la copie comme ceci:

package main

import ( “fmt” )

type Cat struct { age int name string friends []string }

func main() { wilson := Cat{7, “Wilson”, []string{“Tom”, “Tabata”, “Willie”}} nikita := wilson

<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = make([]<span style="color:#66d9ef">string</span>, len(<span style="color:#a6e22e">wilson</span>.<span style="color:#a6e22e">friends</span>))
copy(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#a6e22e">wilson</span>.<span style="color:#a6e22e">friends</span>)

<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = append(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#e6db74">"Syd"</span>)

<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">wilson</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">nikita</span>)

}

jouer

Le code ci-dessus entraîneraWilsonétant{7 Wilson [Tom Tabata Willie]}etNikitaétant{7 Wilson [Tom Tabata Willie Syd]}

Ainsi, vous pouvez voir que la tranche est un objet complètement différent, pas seulement une référence à la même tranche.

Utilisation d'une bibliothèque de copie profonde

https://github.com/jinzhu/copierest (l'une des nombreuses) bibliothèques / helpers de copie profonde disponibles. Il est très facile de copier en profondeur une structure sans gérer explicitement chaque champ. Voici un exemple, tout ce dont nous avons besoin estcopier.Copy(&nikita, &wilson)et nous sommes prêts:

package main

import ( “fmt” github.com/jinzhu/copier )

type Cat struct { age int name string friends []string }

func main() { wilson := Cat{7, “Wilson”, []string{“Tom”, “Tabata”, “Willie”}} nikita := Cat{} copier.Copy(&nikita, &wilson)

<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = append(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#e6db74">"Syd"</span>)

<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">wilson</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">nikita</span>)

}


Plus de tutoriels go: