Explication des méthodes de pointeur sur les types non pointeurs
Dans Go, la convention stipule que les méthodes de valeur peuvent être invoquées à la fois sur des pointeurs et des valeurs, tandis que les méthodes de pointeur sont limitées aux pointeurs. Cependant, une exception apparente à cette règle est la possibilité d'exécuter des méthodes de pointeur sur des valeurs autres que des pointeurs.
Considérez l'extrait de code suivant :
package main import "fmt" type car struct { wheels int } func (c *car) fourWheels() { c.wheels = 4 } func main() { var c = car{} fmt.Println("Wheels:", c.wheels) c.fourWheels() // Here, a pointer method is invoked on a non-pointer value fmt.Println("Wheels:", c.wheels) }
Le code exécute avec succès la méthode de pointeur fourWheels. sur la valeur non pointeur c. Cela peut sembler contradictoire avec la règle établie.
En réalité, lorsque vous invoquez la méthode fourWheels sur la valeur non-pointeur c, vous utilisez une notation abrégée. L'expression c.fourWheels() est équivalente à (&c).fourWheels().
La spécification Go indique : "Si x est adressable et que l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour ( &x).m()."
En d'autres termes, Go déréférence implicitement la valeur non-pointeur c pour obtenir un pointeur vers elle, qui est ensuite utilisé comme récepteur pour le méthode de pointeur.
Pour clarifier la règle sur les méthodes de pointeur, elle doit être interprétée comme suit :
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!