Pointers
Um pointer guarda o endereço de memória de um valor. & pega o endereço de uma variável, e * desreferencia um pointer para obter (ou definir) o valor para o qual ele aponta. Ao contrário do Rust, Go não tem regras de ownership ou borrowing a satisfazer — pointers são apenas uma forma direta de compartilhar e mudar um valor.
package main
import "fmt"
func main() {
count := 10
pointer := &count
fmt.Println(*pointer)
*pointer = 20
fmt.Println(count)
}10 20
Passando um pointer para uma function
Go passa argumentos por value por padrão — uma function normalmente recebe sua própria cópia. Passar um pointer em vez disso permite que uma function modifique a variável real de quem a chamou, e é assim que double abaixo muda value em main mesmo que value em si nunca tenha sido reatribuída lá.
package main
import "fmt"
func double(n *int) {
*n = *n * 2
}
func main() {
value := 21
double(&value)
fmt.Println(value)
}42
A seguir: tratamento de erros — o padrão explícito if err != nil do Go em vez de exceptions.
Practice exercise
Escreva uma function increment(n *int) que some 1 ao valor que n aponta. Chame-a com um pointer para uma variável count := 5, depois imprima count.