Maison >développement back-end >Golang >Pourquoi ne puis-je pas appeler une méthode pointeur sur le résultat d'un appel de fonction Go ?

Pourquoi ne puis-je pas appeler une méthode pointeur sur le résultat d'un appel de fonction Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-19 10:08:15997parcourir

Why Can't I Call a Pointer Method on the Result of a Go Function Call?

Comprendre les erreurs « Impossible de prendre l'adresse de » et « Impossible d'appeler la méthode du pointeur sur »

Lorsque vous travaillez avec Go, vous pouvez rencontrer des erreurs tels que « impossible de prendre l'adresse de » ou « impossible d'appeler la méthode du pointeur », déroutant ceux qui apprennent le langage.

Le problème :

Considérez le code Go suivant :

diff := projected.Minus(c.Origin)
dir := diff.Normalize() // error: cannot call pointer method on Vector3

// Vector3 methods
func (a *Vector3) Minus(b Vector3) Vector3 { ... }
func (a *Vector3) Normalize() Vector3 { ... }

La deuxième ligne provoque des erreurs de compilation car Vector3.Normalize() nécessite un récepteur de pointeur, ce qui signifie qu'il attend un pointeur vers une valeur Vector3 (*Vector3) au lieu d'un Vector3 value.

Pourquoi cela se produit :

Les valeurs de retour des appels de fonction et de méthode ne sont pas adressables dans Go. Par conséquent, dans le deuxième exemple, le compilateur ne peut pas prendre l'adresse du résultat de Vector3.Minus(), l'empêchant d'appeler Normalize() sur cette valeur.

Solutions possibles :

  • Affectation séparée : Attribuez la valeur de retour à une variable et appelez la méthode sur cette variable, comme vu dans le premier exemple où dir = diff.Normalize() fonctionne.
  • Changer le type de récepteur : Modifiez la méthode Normalize() pour avoir un récepteur de valeur (Vector3 au lieu de *Vector3). Cela permet de chaîner les appels de méthode sur des valeurs autres que des pointeurs.
  • Pointeurs de retour : Faites en sorte que Normalize() renvoie un pointeur (*Vector3) pour éviter d'avoir à traiter la valeur de retour.
  • Créer une fonction d'assistance : Créez une fonction pour renvoyer l'adresse d'une valeur, telle que pv(v) pour renvoyer &v, et appelez Normalize() sur son résultat.

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