Avatar ·

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

¡Hola a todos! Empecé a estudiar Go recientemente y me persigue constantemente una pregunta: ¿cuándo debo pasar parámetros a una función por puntero y cuándo por valor? Y lo mismo con los valores de retorno. Parece que entiendo que los punteros permiten evitar la copia de datos, pero en Go ¿todo se copia de todas formas? ¿O no? Escribí un pequeño ejemplo donde creo una estructura User e intento modificarla: ```go type User struct { Name string Age int } func updateUser(u User) { u.Name = "New Name" // no funciona como se esperaba } func updateUserPtr(u *User) { u.Name = "New Name" // funciona } ``` Pero lo que me confunde es que, aunque en Go todo se pasa por valor, los slices y maps se comportan como referencias? ¿O no? He leído que las estructuras grandes es mejor pasarlas por puntero para no copiar, y las pequeñas por valor. Pero ¿qué se considera "grande"? ¿10 campos? ¿20? ¿O no se trata solo del tamaño? Tampoco entiendo cuándo debería devolver un puntero desde una función y cuándo un valor.