Confusion dans la syntaxe d'appel des méthodes du récepteur Go
La documentation dans Effective Go affirme que les méthodes de pointeur ne peuvent être invoquées que sur des pointeurs, pas sur des valeurs. Cependant, une expérience récente remet en question cette notion.
Lors de l'appel de vAge.Set(10) sur un type valeur, le code se compile avec succès. Cela semble contredire la documentation. Cela pose la question : le code est-il incorrect ou y a-t-il un malentendu dans la documentation ?
La réponse réside dans l'adressabilité. La spécification du langage Go précise qu'un appel de méthode sur une valeur est valide si la méthode est définie dans le type de la valeur et que les arguments peuvent être affectés aux paramètres de la méthode.
Si la valeur est adressable, elle peut être déréférencé pour obtenir un pointeur vers le type sous-jacent. Dans ce cas, vAge est adressable car il s'agit d'une valeur d'un type (age) qui prend en charge l'opérateur pointeur (&).
Par conséquent, vAge.Set(10) est équivalent à (&vAge).Set( 10), ce qui est valide car (&vAge) est un pointeur vers l'âge du type. La méthode de pointeur Set peut être invoquée sur ce pointeur, permettant la modification du récepteur.
Cette subtilité du langage permet aux types de valeur dans Go de se comporter d'une manière qui peut ne pas être immédiatement apparente dans la documentation. Il souligne l'importance de comprendre les spécifications linguistiques pour éviter d'éventuelles idées fausses.
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!