Pointeurs ou valeurs : quand utiliser * et & dans les paramètres et valeurs de retour en Go ?
Bonjour à tous ! J'ai commencé à étudier Go récemment, et une question me taraude constamment : quand faut-il passer des paramètres à une fonction par pointeur, et quand par valeur ? Et la même chose pour les valeurs de retour.
Je comprends à peu près que les pointeurs permettent d'éviter la copie de données, mais en Go tout est copié, non ? Ou pas ? J'ai écrit un petit exemple où je crée une structure User et j'essaie de la modifier :
```go
type User struct {
Name string
Age int
}
func updateUser(u User) {
u.Name = "New Name" // ne fonctionne pas comme prévu
}
func updateUserPtr(u *User) {
u.Name = "New Name" // fonctionne
}
```
Mais ce qui me trouble, c'est qu'en Go tout est passé par valeur, mais les slices et les maps se comportent comme des références ? Ou pas ? J'ai lu que les grandes structures sont mieux passées par pointeur pour éviter la copie, et les petites par valeur. Mais qu'est-ce qui est considéré comme "grand" ? 10 champs ? 20 ? Ou est-ce que ça ne concerne pas seulement la taille ?
Je ne comprends pas non plus quand il faut retourner un pointeur depuis une fonction, et quand retourner une valeur.