Maison > développement back-end > Golang > Pourquoi les appels de méthode de chaînage échouent-ils avec les récepteurs de pointeurs dans Go ?

Pourquoi les appels de méthode de chaînage échouent-ils avec les récepteurs de pointeurs dans Go ?

Susan Sarandon
Libérer: 2024-11-29 13:03:10
original
577 Les gens l'ont consulté

Why Does Chaining Method Calls Fail with Pointer Receivers in Go?

Comprendre ""impossible de prendre l'adresse de"" et ""impossible d'appeler la méthode du pointeur sur"" dans Go

Malgré des fonctionnalités similaires des extraits de code, l'un compile et fonctionne tandis que l'autre génère des erreurs :

// This compiles and works
diff := projected.Minus(c.Origin)
dir := diff.Normalize()

// This does not (yields the errors in the title)
dir := projected.Minus(c.Origin).Normalize()
Copier après la connexion

La disparité est attribuée à la différence entre les types de récepteurs pour la méthode Normalize().

Types de récepteurs dans les méthodes Go

Les méthodes Go peuvent avoir soit un récepteur de valeur, soit un récepteur de pointeur. Un récepteur de valeur opère sur une copie de la structure tandis qu'un récepteur de pointeur opère sur la structure d'origine elle-même.

Dans le cas de Normalize(), il dispose d'un récepteur de pointeur, nécessitant un pointeur vers une valeur Vector3 comme valeur. récepteur.

Adressage des variables et des valeurs de retour

Les variables dans Go sont adressables, ce qui signifie l'adresse du une variable peut être considérée comme passée comme argument à une méthode de réception de pointeur. Cependant, les valeurs de retour des appels de fonction et de méthode ne sont pas adressables.

Chaîne d'appels avec des récepteurs de pointeurs

Dans l'exemple où il compile, le compilateur prend automatiquement l'adresse de la variable diff pour correspondre au pointeur récepteur de Normalize().

Dans l'exemple où il ne compile pas, le compilateur ne peut pas automatiquement prendre l'adresse du valeur de retour de Minus() car elle n'est pas adressable. La valeur de retour étant une copie, elle doit d'abord être affectée à une variable, afin que son adresse puisse être prise.

Solutions de contournement

Plusieurs solutions de contournement existent pour résoudre le problème :

  • Récepteur de valeur : Modifiez Normalize() pour avoir un récepteur de valeur, éliminant ainsi le besoin de prenez l'adresse des valeurs de retour.
  • Valeurs de retour du pointeur : Modifiez Minus() pour renvoyer un pointeur vers Vector3.
  • Fonction d'assistance : Créer une fonction d'assistance qui renvoie l'adresse d'une valeur, permettant le chaînage souhaité de appels.

Cohérence des types de récepteurs et de résultats

Il est conseillé de maintenir la cohérence des types de récepteurs et de résultats tout au long d'un type personnalisé. Si la plupart des méthodes disposent de récepteurs pointeurs, toutes les méthodes doivent utiliser des récepteurs pointeurs. De même, si la plupart des méthodes renvoient des pointeurs, toutes les méthodes devraient renvoyer des pointeurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal