Avatar ·

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.