Maison >développement back-end >Golang >Comment Go gère-t-il les appels de méthode avec des récepteurs d'objets lorsque la méthode dispose d'un récepteur de pointeur ?
Appels de méthodes avec des récepteurs d'objets ou de pointeurs
Dans Go, les méthodes peuvent être définies pour les types avec des récepteurs de valeur (non-pointeurs) ou un pointeur récepteurs (pointeurs). Lors de l'appel d'une méthode avec un récepteur pointeur par un objet, Go interprète automatiquement l'appel comme s'il était effectué sur un pointeur vers l'objet.
Par exemple, considérons le code suivant :
package main import ( "fmt" "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) // Calling a method with a pointer receiver using an object fmt.Println(v.Abs()) }
Ici, nous avons un type Vertex avec des méthodes de réception de valeur et de pointeur. Dans la fonction principale, nous créons un objet Vertex v puis appelons la méthode Scale dessus. Normalement, la méthode Scale attend un récepteur de pointeur, mais dans ce cas, nous utilisons un objet.
Le compilateur remarque que v est adressable et que son ensemble de méthodes inclut Scale. Selon la spécification Go :
"Un appel de méthode x.m() est valide si l'ensemble de méthodes de (le type de) x contient m et la liste d'arguments peut être affectée à la liste de paramètres de m. Si x est adressable et l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour (&x).m()."
Par conséquent, l'appel v.Scale(10) est interprété comme (&v).Scale(10), qui transmet effectivement un pointeur vers l'objet v à la méthode Scale. Cela permet à la méthode de modifier les champs X et Y de l'objet comme prévu.
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!