Maison >développement back-end >Golang >Pourquoi puis-je appeler une méthode Go avec un récepteur pointeur en utilisant un objet au lieu d'un pointeur ?
Appel d'une méthode destinée à un pointeur avec un objet
En Go, il est possible d'appeler une méthode destinée à un récepteur de pointeur à l'aide d'un objet au lieu d’un pointeur vers lui. Cela peut sembler inhabituel, mais c'est autorisé selon la spécification Go.
Considérez le code suivant :
package main import "math" type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func main() { v := Vertex{3, 4} v.Scale(10) // v is not a pointer to a Vertex object fmt.Println(v.Abs()) }
Dans cet exemple, v est un objet de type Vertex, et Scale est une méthode destinée à un pointeur vers Vertex. Cependant, au lieu de passer un pointeur vers v, nous appelons directement v.Scale(10).
Pourquoi ce n'est-il pas une erreur ? La réponse réside dans une règle définie dans la spécification Go pour les appels de méthode :
If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().
Cette règle stipule que si la valeur appelée est adressable (c'est-à-dire qu'il s'agit d'une variable locale ou d'un pointeur), alors l'appel une méthode dessus équivaut à appeler la méthode sur son adresse. Dans ce cas, v est une variable locale, donc v.Scale(10) est interprété comme si nous avions écrit (&v).Scale(10) à la place.
Cette commodité nous permet d'écrire plus proprement et plus concis. code sans avoir à créer explicitement un pointeur vers l’objet avant d’appeler la méthode. Cependant, il est important de noter que cela ne fonctionne que pour les méthodes avec récepteurs pointeurs. Pour les méthodes avec des récepteurs de valeurs, le passage d'un pointeur vers l'objet n'est pas autorisé.
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!