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