Hacer una copia de una estructura en Go

Una variable de estructura en Go se puede copiar a otra variable muy fácilmente usando la instrucción de asignación:

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”) } }

tocar

mydogyrogerson dos variables separadas, pero comparándolas propiedad por propiedad son exactamente iguales.

Ahora podemos modificar todas las propiedades de esas variables sin afectar al otro objeto, porque elDogstruct contiene tipos básicos, que se copian por valor.

Si tuviéramos un tipo de referencia en nuestra estructura, esto no fue tan fácil, porque elpointerse copiaría, no el valor, por lo que habría sido uncopia superficial.

Por ejemplo

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

La lista de amigos de nuestro gato es una porción, un tipo de referencia (junto con punteros, mapas, funciones y canales), por lo que si tuvieras un objeto gato y lo copiaras como hicimos para el ejemplo de Perro anterior, no podrías modificar la propiedad de los amigos sin afectar también al otro objeto.

Acopia profundaes necesario.

Copia profunda de una estructura

Puede realizar una copia tan profunda manualmente. En el caso de un corte, puede realizar la copia de esta manera:

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>)

}

tocar

El código anterior resultará enWilsonsiendo{7 Wilson [Tom Tabata Willie]}ynikitasiendo{7 Wilson [Tom Tabata Willie Syd]}

Entonces puede ver que el sector es un objeto completamente diferente, no solo una referencia al mismo sector.

Usando una biblioteca de copia profunda

https://github.com/jinzhu/copieres (uno de los muchos) libs / helpers de copia profunda que existen. Hace que sea realmente fácil copiar en profundidad una estructura sin administrar explícitamente cada campo. Aquí hay un ejemplo, todo lo que necesitamos escopier.Copy(&nikita, &wilson)y estamos listos:

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>)

}


Más tutoriales de go: