Pointers

Pointers #

// Go suporta <em><a href="https://en.wikipedia.org/wiki/Pointer_(computer_programming)">ponteiros</a></em>,
// 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