Maison  >  Article  >  développement back-end  >  ## Pourquoi une valeur peut-elle invoquer une méthode pointeur dans Go ?

## Pourquoi une valeur peut-elle invoquer une méthode pointeur dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 23:58:28424parcourir

## Why Can a Value Invoke a Pointer Method in Go?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn