Documentação de Go
Ponteiros e endereços em Go
Como Go representa endereços com *T e &, quando métodos usam receiver ponteiro e como isso afeta valores e interfaces.
Revisado em 2026-11-15
Endereço e tipo ponteiro
Para um valor x do tipo T, &x obtém seu endereço e produz um valor do tipo *T. O asterisco faz parte da escrita do tipo: *Account significa ponteiro para Account. Ao escrever *p em uma expressão, acessamos o valor apontado.
Um ponteiro permite que funções e métodos acessem o mesmo valor sem copiar a struct inteira. Ele também pode ser nil; dereferenciar um ponteiro nil causa panic.
account := Account{ID: "a", Balance: 5000}
address := &account // *Account
address.Balance -= 100Receivers ponteiro
Em func (a *Account) Withdraw(...), a é o receiver e *Account é seu tipo. O método pode alterar Balance no valor apontado. Go permite chamar esse método com uma variável addressable account, escrevendo account.Withdraw(...); o compilador ajusta a chamada para usar &account quando isso é permitido.
O conjunto de métodos de *Account inclui métodos com receiver Account e *Account; o conjunto de Account inclui apenas métodos com receiver Account. Se uma interface exige um método com receiver ponteiro, normalmente é *Account que a satisfaz.
func (a *Account) Withdraw(amount int64) {
a.Balance -= amount
}Ponteiro para um literal composto
A expressão &TransferService{accounts: accounts} cria um literal composto e obtém um ponteiro para o valor inicializado. O resultado tem tipo *TransferService. NewTransferService é uma convenção de nome, sem tratamento especial do compilador.
Go mantém o valor válido enquanto houver referências a ele. Não precisamos escolher manualmente stack ou heap para escrever essa função.
return &TransferService{accounts: accounts}