Pointeurs vs valeurs : quand utiliser * et & dans les paramètres et valeurs de retour en Go ?
Je viens de commencer à apprendre Go et je confonds constamment quand passer un pointeur et quand passer une valeur. J'ai lu des tonnes d'articles, mais en pratique, je fais toujours mal.
Par exemple, j'ai une structure User et une fonction qui la met à jour :
```go
type User struct {
Name string
Age int
Score float64
}
func UpdateScore(u User, newScore float64) {
u.Score = newScore
}
```
Quand j'appelle `UpdateScore(myUser, 95.5)`, après l'appel `myUser.Score` reste inchangé. J'ai compris que c'est parce que Go copie la structure. Alors je change en `*User` :
```go
func UpdateScore(u *User, newScore float64) {
u.Score = newScore
}
```
Maintenant ça marche. Mais quand j'écris une fonction qui retourne un nouvel utilisateur, je vois deux options :
```go
func NewUser(name string, age int) User { ... }
func NewUserPtr(name string, age int) *User { ... }
```
Laquelle est correcte ? Et aussi : que faire avec les grandes structures ? Dois-je utiliser des pointeurs partout ? Et pour les types de base ?