Dans le Tour of Go, il est mentionné que les pointeurs sont utilisés pour implémenter des méthodes sur des valeurs. Cependant, que se passe-t-il si nous déclarons une méthode avec un récepteur non-pointeur mais tentons de l'utiliser sur une valeur de pointeur, ou vice versa ?
La réponse réside dans deux règles fondamentales du langage Go :
Dérivation de méthode :
Go permet de dériver des méthodes à partir de méthodes existantes. Dans votre exemple, la méthode func (v Vertex) Abs() float64 est dérivée de la méthode func (v *Vertex) Abs() float64. Cela signifie que lorsque vous déclarez l'ancienne méthode, une nouvelle implémentation est automatiquement générée, qui appelle essentiellement la méthode d'origine avec un pointeur vers le récepteur :
func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) } func (v Vertex) Abs() float64 { return Vertex.Abs(*v) } // Automatically generated
Par conséquent, que vous déclariez ou non func (v * Vertex) Abs() ou func (v Vertex) Abs(), dans les deux cas, la méthode générée est appelée.
Adresse automatique Prendre :
Go peut générer automatiquement un pointeur vers une variable. Dans le cas suivant, l'expression v.Abs() se résout en code :
vp := &v vp.Abs()
Cela signifie que lorsque vous transmettez une valeur à une méthode qui attend un pointeur et que Go ne peut pas automatiquement dériver la méthode d'un existant, le compilateur générera un pointeur vers la valeur puis appellera la méthode sur le pointeur.
En résumé, Go suit ces règles pour gérer les pointeurs et méthodes :
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!