Avatar ·

Ponteiros vs Valores: quando usar * e & em parâmetros e valores de retorno em Go?

Acabei de começar a aprender Go e fico constantemente confuso sobre quando passar um ponteiro e quando passar um valor. Li vários artigos, mas na prática ainda faço errado. Por exemplo, tenho uma struct User e uma função que a atualiza: ```go type User struct { Name string Age int Score float64 } func UpdateScore(u User, newScore float64) { u.Score = newScore } ``` Quando chamo `UpdateScore(myUser, 95.5)`, após a chamada `myUser.Score` permanece o mesmo. Entendi que isso acontece porque Go copia a struct. Então mudo para `*User`: ```go func UpdateScore(u *User, newScore float64) { u.Score = newScore } ``` Agora funciona. Mas quando escrevo uma função que retorna um novo usuário, vejo duas opções: ```go func NewUser(name string, age int) User { ... } func NewUserPtr(name string, age int) *User { ... } ``` Qual delas é a correta? E mais: como lidar com structs grandes? Devo usar ponteiros em tudo? E quanto aos tipos básicos?