Méthodes de pointeur sur les types non pointeurs
La réponse à une question précédente indique que les méthodes de pointeur ne peuvent être invoquées que sur des pointeurs. Cependant, cela semble incorrect, comme le démontre le code suivant qui appelle avec succès une méthode pointeur sur une valeur non-pointeur :
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) }
Explication
Le La clé pour comprendre ce comportement réside dans le fait que le récepteur de la méthode est un pointeur. Lorsque vous appelez c.fourWheels(), la valeur du récepteur, c, n'est pas un pointeur. Cependant, comme le type du récepteur est un pointeur, cela est interprété comme un raccourci pour (&c).fourWheels().
Selon la spécification Go, lors de l'appel d'une méthode, si la valeur du récepteur est adressable et que le Le type de récepteur est un pointeur, l'appel de méthode est interprété comme un appel de méthode pointeur. Dans notre cas, la valeur du récepteur c est adressable et le type de récepteur *car est un pointeur, donc l'appel de méthode c.fourWheels() appelle effectivement (&c).fourWheels().
Ce comportement est cohérent avec l'affirmation selon laquelle les méthodes de valeur peuvent être invoquées sur des pointeurs et des valeurs, tandis que les méthodes de pointeur ne peuvent être invoquées que sur des pointeurs. Dans le cas des méthodes de pointeur, si la valeur du récepteur n'est pas un pointeur, elle doit être déréférencée pour obtenir une valeur de pointeur pouvant être utilisée comme récepteur.
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!