Um ponteiro é uma variável que guarda o endereço de memória de outro valor, em vez do valor em si.
Em Go
&xpega o endereço dex;*pacessa o valor no endereço.- O valor zero de um ponteiro é
nil, e acessar*pcomp == nilderruba o programa (panic). - Não há aritmética de ponteiros (como em C), o que elimina uma classe inteira de bugs.
Go sempre passa argumentos por valor (uma cópia). Para uma função alterar o original, passe um ponteiro:
func double(n int) { n *= 2 } // altera a cópiafunc doublePtr(n *int) { *n *= 2 } // altera o original
x := 21double(x) // x continua 21doublePtr(&x) // x agora é 42Ponteiros também evitam copiar structs grandes e permitem métodos que alteram o receptor (func (u *User) Rename(...)).
Em Java
Java não tem ponteiros explícitos, mas toda variável de objeto é uma referência (na prática, um ponteiro gerenciado). E Java também passa tudo por valor: o valor passado é a cópia da referência.
void rename(User u) { u.setName("Ana"); } // altera o objeto originalvoid replace(User u) { u = new User("Ana"); } // só troca a cópia local da referênciaPor isso dá para alterar um objeto recebido, mas não dá para escrever um swap(a, b) que troque as variáveis de quem chamou. Uma referência vazia é null, o equivalente ao nil de Go.
Veja também: Ponteiros em Go e Variáveis e constantes.