Dans Go, il existe différentes façons de renvoyer un struct
valeur ou une tranche de celle-ci. Pour les individus que j'ai vus:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Je comprends les différences entre ceux-ci. Le premier retourne une copie de la structure, le second un pointeur sur la valeur de structure créée dans la fonction, le troisième s'attend à ce qu'une structure existante soit transmise et remplace la valeur.
J'ai vu tous ces modèles être utilisés dans divers contextes, je me demande quelles sont les meilleures pratiques à ce sujet. Quand utiliseriez-vous quoi? Par exemple, le premier pourrait être correct pour les petites structures (car la surcharge est minime), la seconde pour les plus grandes. Et le troisième si vous voulez être extrêmement efficace en mémoire, car vous pouvez facilement réutiliser une seule instance de structure entre les appels. Existe-t-il des meilleures pratiques pour savoir quand les utiliser?
De même, la même question concernant les tranches:
func myfunc() []MyStruct {
return []MyStruct{ MyStruct{Val: 1} }
}
func myfunc() []*MyStruct {
return []MyStruct{ &MyStruct{Val: 1} }
}
func myfunc(s *[]MyStruct) {
*s = []MyStruct{ MyStruct{Val: 1} }
}
func myfunc(s *[]*MyStruct) {
*s = []MyStruct{ &MyStruct{Val: 1} }
}
Encore une fois: quelles sont les meilleures pratiques ici. Je sais que les tranches sont toujours des pointeurs, donc retourner un pointeur sur une tranche n'est pas utile. Cependant, dois-je renvoyer une tranche de valeurs de struct, une tranche de pointeurs vers des structures, dois-je passer un pointeur vers une tranche comme argument (un modèle utilisé dans l' API Go App Engine )?
new(MyStruct)
:) Mais il n'y a pas vraiment de différence entre les différentes méthodes d'allocation des pointeurs et de leur retour.