Go by Example: Pointers

Go soporta punteros, permitiendo pasar referencias a valores y registros dentro de tu programa.

package main
import "fmt"

Mostraremos cómo funcionan los punteros en contraste con los valores con 2 funciones: zeroval y zeroptr. zeroval tiene un parámetro int, por lo que los argumentos se pasarán por valor. zeroval obtendrá una copia de ival distinta de la que está en la función que llama.

func zeroval(ival int) {
    ival = 0
}

zeroptr en contraste tiene un parámetro *int, lo que significa que toma un puntero int. El código *iptr en el cuerpo de la función luego dereferences el puntero de su dirección de memoria al valor actual en esa dirección. Asignar un valor a un puntero des-referenciado cambia el valor en la dirección referenciada.

func zeroptr(iptr *int) {
    *iptr = 0
}
func main() {
    i := 1
    fmt.Println("initial:", i)
    zeroval(i)
    fmt.Println("zeroval:", i)

La sintaxis &i da la dirección de memoria de i, es decir, un puntero a i.

    zeroptr(&i)
    fmt.Println("zeroptr:", i)

Los punteros también se pueden imprimir.

    fmt.Println("pointer:", &i)
}

zeroval no cambia el i en main, pero zeroptr sí lo hace porque tiene una referencia a la dirección de memoria de esa variable.

$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

Siguiente ejemplo: Strings and Runes.