Méthodes Go sur les types de pointeurs : méthodes d'appel avec le récepteur T pour le type de pointeur *T
Question :
La spécification Go indique que l'ensemble de méthodes d'un type pointeur T inclut l'ensemble de méthodes de son type correspondant T. Cela signifie-t-il que nous pouvons appeler des méthodes avec le récepteur T sur des variables de type T ?
Réponse :
Bien que la spécification le suggère, c'est Il est important de noter que vous ne pouvez pas appeler directement les méthodes de *T sur T. Au lieu de cela, le compilateur déréférence automatiquement la variable vers &T et appelle la méthode, exécutant efficacement (&T).m().
Ce comportement est explicitement défini dans la spécification Go :
"Appels : Un appel de méthode x.m() est valide si l'ensemble de méthodes de (le type de ) x contient m et la liste d'arguments peut être affectée à la liste de paramètres de m Si x est adressable et que l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour (&x).m(). "
Démonstration :
L'exemple suivant illustre ce comportement :
package main import ( "fmt" "reflect" ) type User struct{} func (this *User) SayWat() { fmt.Println(reflect.TypeOf(this)) fmt.Println("WAT\n") } func main() { var user = User{} fmt.Println(reflect.TypeOf(user)) user.SayWat() }
Malgré la déclaration de la méthode SayWat avec un récepteur de *User, nous peut l'invoquer sur l'utilisateur, qui est de type User. Le compilateur gère automatiquement le déréférencement et appelle (&user).SayWat().
Exception :
Cependant, cela ne s'applique qu'aux variables adressables. Si vous tentez d'appeler une méthode pointeur sur une valeur non adressable, vous rencontrerez une erreur. Par exemple :
func aUser() User { return User{} } ... aUser().SayWat() // Error: cannot call pointer method on aUser()
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!