Copia vs referencia dentro de estructuras
Es importante hacer notar que cuando se realiza una copia de una estructura a través de una igualdad, se realiza una copia completa de los valores de esta. Es decir.
Ejemplo de asignación por copia de una estructura en Go
package main
import "fmt"
type Pais struct {
Nombre string
}
func main() {
pais1 := Pais{Nombre: "Canada"}
pais2 := pais1
pais1.Nombre = "Inglaterra"
fmt.Printf("%+v\n", pais1)
fmt.Printf("%+v\n", pais2)
}
Descripción del ejemplo de asignación por copia de una estructura en Go
En la salida tendremos.
{Nombre:Inglaterra}
{Nombre:Canada}
- Como vemos,
pais2 := pais1
ha realizado una copia completa de pais1. - Si actualizamos
pais1
, en este caso con el nombre Inglaterrapais2
no se verá afectado.
Ejemplo de asignación por referencia de una estructura en Go
Actualicemos ahora el script, utilizando un puntero.
package main
import "fmt"
type Pais struct {
Nombre string
}
func main() {
pais1 := Pais{Nombre: "Canada"}
pais2 := &pais1
pais1.Nombre = "Inglaterra"
fmt.Printf("%+v\n", pais1)
fmt.Printf("%+v\n", *pais2)
}
Descripción del ejemplo de asignación por referencia de una estructura en Go
El resultado sera.
{Nombre:Inglaterra}
{Nombre:Inglaterra}
Como vemos si modificamos pais1
este también tendrá efecto en pais2
, debido a que usamos la dirección de la memoria.
Para ello…
-
La igualdad referencia un puntero
pais2 := &pais1
establecido mediante el ampersand&
antes en&pais1
. -
Agregamos el asterisco
*
en*pais2
, para acceder al valor de la dirección de la memoria (si no lo agregamos imprimirá la dirección en lugar de su valor).