Uso de punteros en estructuras

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 Inglaterra pais2 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).