Invocation de méthode pointeur sur des valeurs non-pointeur
Dans Go, il est possible d'invoquer des méthodes pointeur sur des valeurs non-pointeur, malgré le règle générale selon laquelle les méthodes de pointeur ne peuvent être invoquées que sur des pointeurs. Ce comportement apparemment contradictoire peut s'expliquer par le concept de déréférencement automatique du pointeur.
Dans l'extrait de code donné :
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() fmt.Println("Wheels:", c.wheels) }
L'expression c.fourWheels() est un raccourci pour (&c) .fourWheels(). En effet, le récepteur de fourWheels est un pointeur et c est une valeur non-pointeur. Puisque c est adressable, le compilateur le déréférence automatiquement pour obtenir un pointeur vers la valeur de la voiture, qui est ensuite utilisée comme récepteur.
Ce comportement est explicitement indiqué dans la spécification Go :
Si x est adressable et que l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour (&x).m().
Par conséquent, même si la règle générale concernant les méthodes de pointeur reste valable, le déréférencement automatique du pointeur permet l'invocation pratique de méthodes de pointeur sur des valeurs non-pointeurs dans certaines situations. Il est important de noter que ce comportement s'applique uniquement aux méthodes avec des récepteurs de pointeurs.
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!