Punteros

9. Punteros#

Un puntero es una variable que almacena una dirección de memoria a otra variable de un determinado tipo.

Si asignamos un int, un struct o un array, se copia el contenido del elemento. Para lograr el mismo efecto que con las referencias a variables en Java, Go usa punteros.

Para cualquier tipo T, existe un correspondiente tipo puntero *T, que determina un puntero a un valor de tipo T.

Si declaramos una variable de tipo int, podemos crear un puntero que apunte a esa variable, este puntero será de tipo *int:

import "fmt"

var a int = 7
var pa *int = &a

fmt.Println("pa:", pa)
fmt.Println("*pa:", *pa)
pa: 0xc000536000
*pa: 7

Los punteros son tanto poderosos como simples, pero es posiblemente uno de los temas más difíciles de asimilar. Hablemos un poco de sintaxis, cuando trabajamos con punteros utilizamos 2 operadores, por un lado el operador de “desreferencia” que es * y por otro lado el operador & que devuelve la posición de memoria de una variable.

Cómo podemos ver en nuestro código estamos obteniendo la dirección de memoria de la variable a (es decir su puntero) y lo almacenamos en la variable pa que es de tipo *int (no confundir el operador * con el asterisco que se agrega delante del nombre de un tipo para indicar que en realidad es el puntero a un tipo).

El término “desreferenciar” significa tomar la posición de memoria y hacer referencia al contenido de esa posición de memoria, no a la dirección en sí. Por eso, cuando hacemos *pa estamos refiriendo al espacio de memoria donde fué definida la variable a.

En Java, dependiendo el tipo de dato, los valores eran pasados por referencia o por valor. En Go, nosotros debemos explicitar si vamos a recibir un valor por referencia o por valor, al momento de definir los argumentos de nuestras funciones.