Ensembles de méthodes Go : appel de méthodes pour les types de pointeurs et le récepteur
Un aspect souvent discuté des ensembles de méthodes Go survient lors de la tentative d'appel méthodes avec récepteur de type T sur des variables de type T. La spécification Go indique que l'ensemble de méthodes de T comprend à la fois les méthodes avec récepteur tapez *T et ceux avec le type de récepteur T.
Inférences contradictoires
Cependant, l'exemple suivant démontre que cette inférence peut sembler contre-intuitive :
package main import ( "fmt" "reflect" ) 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{} fmt.Println(reflect.TypeOf(user), "\n") user.SayWat() }
Inférence du compilateur
Le compilateur déduit que user.SayWat() appelle la méthode avec le type de récepteur *T, bien que la variable user soit de type T. Ce comportement est dû à l'insertion automatique par le compilateur de &, l'opérateur d'adresse de. Essentiellement, il réécrit l'appel à (&user).SayWat().
Méthodes d'appel pour les types de pointeurs
Il est important de clarifier que même s'il apparaît que les méthodes pour les types pointeurs sont appelées sur des variables de type T, ce n'est pas strictement vrai. Le compilateur utilise un récepteur de type *T, et le déréférencement de &user vers T est une opération implicite.
Exceptions au déréférencement implicite
Cependant, cette opération implicite le déréférencement ne s’applique pas dans tous les cas. L'appel d'une méthode avec un récepteur de pointeur sur une valeur de retour (non adressable) entraînera une erreur de compilation, telle que :
func aUser() User { return User{} } ... aUser().SayWat()
Message d'erreur
cannot call pointer method on aUser() cannot take the address of 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!