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”)
}
}
mydog
yroger
son 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 elDog
struct 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 elpointer
se 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>)
}
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:
- Uso de NGINX Reverse Proxy para brindar servicios de Go
- Hacer una copia de una estructura en Go
- Los conceptos básicos de un servidor web Go
- Ordenar un tipo de mapa en Go
- Ir consejos en pocas palabras
- Explicación de las etiquetas Go
- Ir al formato de fecha y hora
- Procesamiento JSON con Go
- Ir a funciones variadas
- Hoja de referencia de Go Strings
- Explicación de la interfaz Go Empty
- Depuración de Go con VS Code y Delve
- Parámetros de devoluciones de Go Named
- Generación de cadenas y números aleatorios en Go
- Estructura del sistema de archivos de un proyecto de Go
- Algoritmo de búsqueda binaria implementado en Go
- Uso de indicadores de línea de comando en Go
- GOPATH explicado
- Cree una aplicación de línea de comandos con Go: lolcat
- Construyendo un comando CLI con Go: cowsay
- Uso de Shell Pipes con Go
- Tutorial de Go CLI: clon de la fortuna
- Enumere los archivos en una carpeta con Go
- Use Ir para obtener una lista de repositorios de GitHub
- Ve, agrega un trozo de cadenas a un archivo
- Ve, convierte una cadena en un segmento de bytes
- Visualice sus contribuciones locales de Git con Go
- Introducción a la creación de perfiles de memoria y CPU de Go
- Resolver el error "no admite la indexación" en un programa Go
- Medir el tiempo de ejecución en un programa Go
- Creación de un rastreador web con Go para detectar títulos duplicados
- Siga las mejores prácticas: ¿puntero o receptores de valor?
- Siga las mejores prácticas: ¿Debería utilizar un método o una función?
- Ir a estructuras de datos: Establecer
- Hoja de referencia de Go Maps
- Genere implementaciones para tipos genéricos en Go
- Ir a estructuras de datos: diccionario
- Ir a estructuras de datos: tabla hash
- Implementar oyentes de eventos en canales de paso
- Ir a estructuras de datos: apilar
- Ir a estructuras de datos: cola
- Ir a estructuras de datos: árbol de búsqueda binaria
- Ir a estructuras de datos: gráfico
- Ir a estructuras de datos: lista vinculada
- La guía completa de Go Data Structures
- Comparación de valores de Go
- ¿Go está orientado a objetos?
- Trabajar con una base de datos SQL en Go
- Usar variables de entorno en Go
- Ir al tutorial: API REST respaldada por PostgreSQL
- Habilitación de CORS en un servidor web Go
- Implementación de una aplicación Go en un contenedor Docker
- Por qué Go es un lenguaje poderoso para aprender como desarrollador PHP
- Ve, elimina el carácter de nueva línea io.Reader.ReadString
- Ir, cómo ver los cambios y reconstruir su programa
- Ve, cuenta los meses desde una fecha
- Acceder a los parámetros HTTP POST en Go