Avatar ·

Punteros vs valores: ¿cuándo usar * y & en parámetros y valores de retorno en Go?

Acabo de empezar a aprender Go y constantemente me confundo sobre cuándo pasar un puntero y cuándo un valor. Parece que he leído un montón de artículos, pero en la práctica sigo haciéndolo mal. Por ejemplo, tengo una estructura User y una función que la actualiza: ```go type User struct { Name string Age int Score float64 } func UpdateScore(u User, newScore float64) { u.Score = newScore } ``` Cuando llamo a `UpdateScore(myUser, 95.5)`, después de la llamada `myUser.Score` sigue siendo el mismo. Entendí que esto es porque Go copia la estructura. Entonces cambio a `*User`: ```go func UpdateScore(u *User, newScore float64) { u.Score = newScore } ``` Ahora funciona. Pero cuando escribo una función que devuelve un nuevo usuario, veo dos opciones: ```go func NewUser(name string, age int) User { ... } func NewUserPtr(name string, age int) *User { ... } ``` ¿Cuál de ellas es correcta? Y además: ¿qué hacer con estructuras grandes? ¿Escribir punteros en todas partes? ¿Y qué pasa con los tipos básic