Maison >développement back-end >Golang >Les méthodes Go avec des récepteurs pointeurs peuvent-elles être appelées sur des variables non-pointeurs ?

Les méthodes Go avec des récepteurs pointeurs peuvent-elles être appelées sur des variables non-pointeurs ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-01 16:22:10556parcourir

Can Go Methods with Pointer Receivers Be Called on Non-Pointer Variables?

Les méthodes des types pointeurs peuvent-elles être appelées sur des types simples dans Go ?

Malgré la spécification Go indiquant que la méthode définie pour T inclut les méthodes de T, une confusion surgit quant à savoir si les méthodes avec des récepteurs T peuvent être invoquées sur des variables de type T.

Invocation de méthode

Le nœud du problème est que les appels de méthode ne se limitent pas à l'utilisation du type de récepteur pointeur. Le compilateur gère intelligemment les invocations de méthodes en déréférençant automatiquement la valeur pour obtenir le type de récepteur souhaité. En effet, les appels aux méthodes avec des récepteurs *T sont équivalents aux appels à (&user).m(), où &user récupère l'adresse de la variable.

Démonstration pratique

Considérez l'exemple de code suivant :

package main

import "fmt"

type User struct{}

func (self *User) SayWat() {
  fmt.Println(self)
  fmt.Println(reflect.TypeOf(self))
  fmt.Println("WAT\n")
}

func main() {
  var user User
  user.SayWat()
}

Lors de l'exécution de ce code, vous remarquerez que la méthode est exécutée avec succès, même si l'utilisateur est pas de type pointeur. En effet, le compilateur déréférence automatiquement l'utilisateur pour appeler la méthode SayWat.

Résoudre l'ambiguïté

Une distinction nette apparaît lors du traitement des retours de méthode. Si une méthode renvoie une valeur, elle crée un résultat non adressable, qui ne peut pas être invoqué directement avec la syntaxe point. Utilisez plutôt explicitement la syntaxe "&" pour obtenir l'adresse de la valeur de retour.

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