Go Memória Básico
Ponteiros
Em Go, um ponteiro é uma variável que guarda o endereço de memória de outra variável. Com o operador & você obtém o endereço de uma variável, e com * você acessa o valor armazenado nesse endereço (desreferenciação). Ponteiros permitem compartilhar dados entre funções sem copiar grandes estruturas e modificar o valor original.
Ponteiros para structs são muito comuns: p := &Pessoa{...} cria um ponteiro para uma struct e p.Nome acessa o campo diretamente (Go faz a desreferenciação automática). A função new(T) aloca memória para um valor do tipo T e retorna um ponteiro *T já zerado.
Use ponteiros quando precisar modificar o valor original dentro de uma função, evitar cópias custosas de grandes structs ou indicar que um valor pode ser nil. Evite ponteiros para tipos pequenos e imutáveis, como int em operações simples, pois a indireção adiciona complexidade desnecessária.
Pontos-chave
&variavelretorna o endereço de memória (um ponteiro).*ponteiroacessa o valor apontado (desreferenciação).new(T)aloca um T zerado e devolve*T.- Ponteiros para struct permitem modificar campos sem copiar a struct.
- Use ponteiros para modificar valores, evitar cópias grandes ou representar ausência (
nil).
package main
import "fmt"
type Pessoa struct {
Nome string
Idade int
}
// aniversario recebe um ponteiro para modificar a Pessoa original.
func aniversario(p *Pessoa) {
p.Idade++ // Go desreferencia automaticamente: (*p).Idade++
}
func main() {
// Ponteiro para int
n := 10
ptr := &n // & obtém o endereço
fmt.Println(*ptr) // * acessa o valor: 10
*ptr = 20 // modifica o valor original
fmt.Println(n) // 20
// Ponteiro para struct
p := Pessoa{"Ana", 30}
aniversario(&p) // passa o endereço
fmt.Println(p.Idade) // 31
// new aloca um ponteiro para struct zerada
q := new(Pessoa)
q.Nome = "Bruno" // desreferenciação automática
q.Idade = 25
fmt.Println(*q) // {Bruno 25}
}