Syntaxe d'appel des méthodes de récepteur Go : une plongée plus approfondie
Dans le guide "Effective Go", il est indiqué que les méthodes de pointeur ne peuvent être invoquées sur des pointeurs, tandis que les méthodes de valeur peuvent être invoquées sur des pointeurs ou des valeurs. Cependant, une rencontre récente pose une question : pourquoi une valeur appelle-t-elle une méthode pointeur dans le code suivant ?
<code class="go">package main import ( "fmt" ) type age int func (a age) String() string { return fmt.Sprintf("%d yeasr(s) old", int(a)) } func (a *age) Set(newAge int) { if newAge >= 0 { *a = age(newAge) } } func main() { var vAge age = 5 pAge := new(age) vAge.Set(10) // Compilation successful }</code>
Pour résoudre ce problème, nous nous tournons vers la spécification du langage Go. Sous « Appels », il est indiqué :
Un appel de méthode x.m() est valide si l'ensemble de méthodes de (le type de) x contient m et que la liste d'arguments peut être affectée à la liste de paramètres de m. Si x est adressable et que l'ensemble de méthodes de &x contient m, x.m() est un raccourci pour (&x).m().
Dans notre cas, vAge est adressable (une conversion de type en *age est valide), donc vAge.Set(10) est essentiellement (&vAge).Set(10). Puisque le type récepteur de Set() est un pointeur, c'est pourquoi la valeur vAge peut invoquer la méthode pointeur Set().
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!