Ponteiros e o Operador de Endereço
Ponteiros armazenam o endereço de um valor, permitindo mutação entre limites de função e evitando grandes cópias.
Busque em todas as páginas da documentação
Ponteiros armazenam o endereço de um valor, permitindo mutação entre limites de função e evitando grandes cópias.
Go tem ponteiros, mas não aritmética de ponteiros, mantendo a segurança de memória simplificada.
&x obtém o endereço de x; *p desreferencia o ponteiro p.
Argumentos de função são passados por valor; compartilhe mutação passando ponteiros.
Receptores de métodos podem ser valores ou ponteiros; receptores de ponteiro são necessários quando métodos modificam o estado.
Cartão de referência rápida - pronto para copiar e colar.
package main
import "fmt"
func increment(n *int) {
*n++
}
func main() {
count := 10
increment(&count)
fmt.Println(count)
}Quando usar isso:
*T.package main
import "fmt"
type Config struct {
Host string
Port int
}
func (c *Config) SetPort(p int) {
c.Port = p
}
func clone(cfg Config) Config {
return cfg // struct copiada por valor
}
func main() {
cfg := Config{Host: "localhost", Port: 8080}
cfg.SetPort(9090)
copy := clone(cfg)
copy.Port = 1
fmt.Println(cfg.Port, copy.Port)
var p *int
if p != nil {
fmt.Println(*p)
} else {
fmt.Println("p é nulo")
}
}O que isso demonstra:
SetPort modifica cfg no local.copy.Port não afeta cfg.& não é necessário ao chamar métodos de receptor de ponteiro em valores endereçáveis.&.new(T) aloca um T zerado e retorna *T; código idiomático frequentemente usa &T{}.nil comparam igual entre si e com nil não tipado em contexto de ponteiro tipado.nil.| Aspecto | Por valor T | Por ponteiro *T |
|---|---|---|
| Custo da cópia | Struct inteira | Palavra do ponteiro |
| Mutação no chamado | Não (a menos que retornado) | Sim, via desreferenciação |
nil é possível | Não para valor | Sim |
omitempty JSON | N/A | Omite ponteiros nulos |
| Use receptor de ponteiro quando | Use receptor de valor quando |
|---|---|
| O método modifica o receptor | Tipo pequeno e imutável |
| A struct é grande | Consistência com a API existente |
| Precisa compartilhar estado de mutex | Métodos de valor zero devem funcionar (time.Time) |
// Campo opcional
type User struct {
Name string
Nick *string // nil significa não definido
}
// Não passe ponteiro para variável de loop sem copiar
for i := 0; i < 3; i++ {
n := i
go func() { fmt.Println(&n) }()
}*p quando p == nil causa pânico. Correção: verifique p != nil ou garanta a construção.return (*T)(nil), err ainda torna a interface não nula. Correção: retorne uma interface nula ou um valor concreto.item := item dentro do loop.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Retornar novo valor | Transformações imutáveis | Structs grandes ou muitas mutações |
Ponteiro *T | Mutação, campos opcionais | Inteiros/booleanos minúsculos (use valor) |
| Interface | Ocultar tipo concreto | Precisa de distinção clara entre nulo e valor |
sync/atomic | Contadores concorrentes | Campos de struct gerais |
Não - você não pode incrementar ponteiros como em C.
Use slices para travessia de buffer.
Go pega automaticamente o endereço para receptores de ponteiro quando o valor é endereçável: cfg.SetPort(1) chama (&cfg).SetPort(1).
Não - &m[key] é inválido porque o armazenamento do mapa pode se mover.
Copie para uma variável local e aponte para ela se precisar temporariamente.
new(T) retorna *T para um T inicializado com zero.
make é apenas para slices, mapas e canais.
Valores de ponteiro comparam com == e != se apontam para a mesma variável ou ambos são nulos.
Eles não comparam o conteúdo do slice.
Pegar &local pode fazer local escapar para o heap se o ponteiro sobreviver à função.
O compilador decide; você não pode forçar a alocação em pilha de forma confiável.
*string com omitempty omite campos não definidos em JSON.
Use ponteiros para campos de API opcionais; valores para os obrigatórios.
Ponteiro para ponteiro - raro em código de aplicação.
Aparece em interoperabilidade com C ou algumas APIs genéricas.
Sim - a análise de escape move locais para o heap quando seus endereços escapam.
Isso é seguro em Go, ao contrário do retorno de pilha em C.
Defina como nil ou substitua por &T{} para um novo valor zero.
Escolha com base se ausente vs. vazio é importante para os chamadores.
Mutex não deve ser copiado após o primeiro uso.
Receptores de ponteiro em tipos que incorporam Mutex evitam cópias acidentais por métodos de valor.
Um ponto de saída de baixo nível para interoperabilidade e otimizações avançadas.
Evite em código de aplicação, a menos que você realmente precise das regras do pacote unsafe.
newVersões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026