Go Best Practices: pointeur ou récepteurs de valeur?

Dilemme courant lors de la définition des méthodes d'une structure.

En particulier, lorsque vous décidez de vos récepteurs de méthode, devez-vous utiliser des récepteurs de pointeur ou des récepteurs de valeur?

func (t *Type) Method() {} //pointer receiver

contre

func (t Type) Method() {} //value receiver

Les récepteurs de méthode peuvent être assimilés aux arguments de fonction dans leur comportement, et tout ce qui est applicable au passage d'un pointeur ou d'une valeur en tant qu'argument de fonction s'applique toujours aux récepteurs de méthode.

Quand devriez-vous utiliser des récepteurs de pointeur

Modifier le récepteur

Si vous souhaitez modifier l'état du récepteur dans une méthode, en manipulant la valeur de celui-ci,utiliser un récepteur de pointeur. Ce n'est pas possible avec un récepteur de valeur, qui copie par valeur. Toute modification d'un récepteur de valeur est locale à cette copie.

Optimisation

Si la structure sur laquelle vous définissez la méthode est très volumineuse, la copier serait beaucoup trop coûteuse que d'utiliser un récepteur de valeur.

Les récepteurs de valeur fonctionnent sur une copie de la valeur de type d'origine. Cela signifie qu'il y a un coût impliqué, surtout si la structure est très grande et si le pointeur reçu est plus efficace.

Quand les récepteurs de valeur sont meilleurs

Si vous n'avez pas besoin de modifier la valeur du récepteur,utiliser un récepteur de valeur.

Les récepteurs de valeur sont sécurisés pour la concurrence, tandis queles récepteurs de pointeurs ne sont pas sûrs pour la concurrence.

Quand faut-il faire un compromis

Il y a une situation où vous voudrez peut-être utiliser des récepteurs de pointeur pour des méthodes où vous utiliseriez normalement un récepteur de valeur, et c'est lorsque vous avez d'autres récepteurs de pointeur définis sur ce type, et pourcohérencevous devez utiliser des récepteurs de pointeur dans toutes les méthodes.

Lire la suite


Plus de tutoriels go: