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!