Go Em Exemplos: Pointers

Go suporta ponteiros, permitindo passar referências a valores dentro do programa.

package main
import "fmt"

Será apresentado como ponteiros funcionam em contraste a valores, com duas funcões: zeroval and zeroptr. zeroval recebe um int como parâmetro, então argumentos serão passados para dentro da função como um valor. zeroval terá uma cópia de ival distinta da que foi passada no chamamento da função.

func zeroval(ival int) {
    ival = 0
}

zeroptr de outra forma, recebe um *int como parâmetro, ou seja, um ponteiro de int. A expressão *iptr no corpo da função dereferencia o ponteiro de seu endereço de memória para o atual valor presente naquele endereço. Atribuindo um valor 0 ao ponteiro dereferenciado altera o valor presente no endereço. Em termos mais claros, diferente do zeroval, a função zeroptr não recebe uma cópia do valor, mas o próprio endereço de memória que o valor ocupa. Ao dereferenciar o endereço e atribuir um novo valor, se está alterando o próprio valor e não uma cópia.

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

A sintaxe &i se refere ao endereço de memória de i, ou seja, ponteiro para i.

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

Ponteiros também podem ser impressos.

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

zeroval não altera o valor de i em main, mas zeroptr altera porque recebe uma referência ao endereço de memória para aquela variável.

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

Próximo exemplo: Strings and Runes.