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
Susan Sarandonoriginal
2024-11-29 13:03:10714parcourir

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()

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!

Déclaration:
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