web-dev-qa-db-fra.com

Golang: quand utiliser des pointeurs

Je suis nouveau dans le langage Go, et je n'ai qu'une expérience minimale en C/C++, donc naturellement je me bats avec l'idée de savoir quand utiliser des pointeurs et quand ne pas utiliser de pointeurs. Bien que cette question puisse être considérée comme ouverte, je me demande quelles sont les lignes directrices sur le moment de retourner des structures et quand renvoyer des pointeurs (et de manière équivalente quand accepter des structures/pointeurs comme arguments).

D'après ce que je peux deviner, les affirmations suivantes sont vraies:

  1. les structures sont passées aux fonctions par valeur. C'est-à-dire qu'une copie d'une structure est faite lors de son passage dans une fonction.
  2. si je veux passer une structure par référence, j'utiliserais plutôt un argument pointeur dans la définition de la fonction et utiliser l'opérateur addressof lors de l'appel de la fonction.
  3. La raison pour laquelle je voudrais passer dans une structure par référence est parce que soit la structure que je passe est grande, et ce serait taxer la mémoire de la passer par valeur (peu probable) ou si je veux apporter des modifications à la copie que je passe (plus probable).
  4. En corollaire à 3.), je devrais passer par valeur à moins d'avoir l'une des raisons ci-dessus pour passer par référence.

Mes hypothèses sont-elles correctes? Ou est-ce que je manque la marque sur les pointeurs?

47
Jim Pedid

Vos hypothèses sont correctes. À propos de # 3, Go est un langage simultané et le passage par référence dans les goroutines les fait tous lire la même structure qui est sûre, mais leur fait également modifier la même structure qui est dangereuse.

23
Uvelichitel