AnyCompiler

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)
}
Output
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)
}
Output
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.