Les pointeurs vs les valeurs des paramètres et valeurs de retour

En Aller il y a différentes façons de retourner un struct valeur ou d'une tranche de celui-ci. Pour les individuels, ceux que j'ai vu:

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 ces. La première renvoie une copie de la structure, le second est un pointeur vers la structure de la valeur créée au sein de la fonction, la troisième s'attend à un existant struct être passé dans et remplace la valeur.

J'ai vu tous ces modèles être utilisée dans différents contextes, je me demandais quelles sont les meilleures pratiques à l'égard de ces. Quand souhaitez-vous utiliser qui? Par exemple, le premier pourrait être ok pour les petites structures (comme l'espace est minime), la seconde pour les plus grands. Et la troisième, si vous voulez être extrêmement efficace en terme de mémoire, parce que vous pouvez facilement réutiliser une struct exemple entre les appels. Existe-il des pratiques exemplaires pour quand utiliser?

De la même façon, 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: quelles sont les meilleures pratiques ici. Je sais que les tranches sont toujours les pointeurs, afin de retourner un pointeur vers une tranche n'est pas utile. Cependant, dois-je retourner une tranche de struct valeurs, une tranche de pointeurs sur les structures, dois-je passer un pointeur à une tranche comme argument (un motif est utilisé dans le Aller à App Engine API)?

  • Comme tu dis, ça dépend vraiment du cas d'utilisation. Tous sont valables en fonction de la situation - est-ce un objet mutable? voulons-nous une copie ou un pointeur? etc. BTW, vous n'avez pas mentionné à l'aide de new(MyStruct) 🙂 Mais il n'y a pas de différence vraiment entre les différentes méthodes d'affectation de pointeurs et de les renvoyer.
  • C'est-à-dire sur l'ingénierie. Les structures doivent être assez grandes pour que de retourner un pointeur rend votre programme plus rapide. Il suffit de ne pas les déranger, de code, de profil, de fixer, si utile.
  • Il n'y a qu'une seule façon de retourner une valeur ou un pointeur, et c'est pour renvoyer une valeur, ou un pointeur. Comment vous allouer est une question distincte. Utilisez ce qui fonctionne pour votre situation, et d'aller écrire un peu de code avant de vous en soucier.
  • BTW, juste par curiosité je benchamrked cette. Le retour des structs vs pointeurs semble être à peu près la même vitesse, mais le passage de pointeurs de fonctions en bas de la lignes est siginificantly plus rapide. Bien que n'étant pas sur un niveau, il serait question
  • Je suppose que c'est juste bc répartition se fait en dehors de la fonction. Aussi l'analyse comparative des valeurs vs pointeurs dépend de la taille de la structure et de la mémoire des schémas d'accès après le fait. La copie en cache de la ligne de la taille est aussi rapide que vous pouvez obtenir, et de la vitesse de déréférencement de pointeurs de cache du PROCESSEUR est très différente de la référence à partir de la mémoire principale.
  • Votre App Engine exemple est intéressant. Ma réponse ci-dessous suggère qu'il doit retourner éventuellement élargi tranche comme append. Je pense App Engine ne le fait pas parce qu'il aurait à retourner un interface{} (depuis spécifiques struct type n'est connu que de façon dynamique) et les concepteurs ne veulent pas forcer l'utilisateur à taper-faire valoir un retour interface{} retour à la spécificité de ce type de tranche, parce que c'est verbeux/maladroit. C'est donc une situation particulière (redimensionnement de la tranche + élément de type non connu au moment de la compilation), qui rend pointeur de la tranche attrayant il.
  • Connexes: Pourquoi un constructeur d'Aller de l'adresse de retour?
  • merci pour l'analyse comparative des! Donc le passage de pointeurs autour est le plus rapide? Je viens de lire : segment.com/blog/... qui dit en utilisant des valeurs rend la collecte des ordures travail plus facile?
  • il dépend aussi de garder à l'esprit que ma réponse est près de 6 ans, le moteur d'exécution a changé depuis.

InformationsquelleAutor Zef Hemel | 2014-05-08