Ponteiros ou valores: quando usar * e & em parâmetros e valores de retorno em Go?
Olá a todos! Comecei a estudar Go recentemente e fico constantemente me perguntando: quando devo passar parâmetros para uma função por ponteiro e quando por valor? E o mesmo para valores de retorno.
Até entendo que ponteiros evitam cópia de dados, mas em Go tudo é copiado? Ou não? Escrevi um pequeno exemplo onde crio uma struct User e tento modificá-la:
```go
type User struct {
Name string
Age int
}
func updateUser(u User) {
u.Name = "New Name" // não funciona como esperado
}
func updateUserPtr(u *User) {
u.Name = "New Name" // funciona
}
```
Mas o que me confunde: em Go tudo é passado por valor, mas slices e maps se comportam como referências? Ou não? Li que structs grandes é melhor passar por ponteiro para não copiar, e as pequenas por valor. Mas o que é considerado "grande"? 10 campos? 20? Ou não é só sobre tamanho?
Também não entendo quando devo retornar um ponteiro de uma função e quando um valor.