Pourquoi les variables Struct Go ne peuvent-elles pas implémenter d'interfaces avec des récepteurs de pointeurs ?
Dans Go, les méthodes struct peuvent avoir soit des récepteurs de valeur (qui fonctionnent sur la valeur de la structure directement) ou des récepteurs de pointeurs (qui fonctionnent sur un pointeur vers la structure). Lors de l'implémentation d'interfaces, il existe des restrictions subtiles sur les types qui peuvent satisfaire l'interface en fonction du type de récepteur des méthodes d'interface.
Considérez le code suivant :
type greeter interface { hello() goodbye() } type tourGuide struct { name string }
Nous pouvons définir des méthodes avec récepteurs de valeur et de pointeur pour tourGuide :
func (t tourGuide) hello() { fmt.Println("Hello", t.name) } func (t *tourGuide) goodbye() { fmt.Println("Goodbye", t.name) }
Maintenant, voici la clé différence :
Les variables ou les copies de tourGuide peuvent appeler à la fois les méthodes de réception de valeur et de pointeur :
var t1 tourGuide = tourGuide{"James"} t1.hello() // works t1.goodbye() // works
Cependant, les variables d'interface ne peuvent être attribué à partir de types pouvant implémenter toutes les méthodes d'interface avec le même type de récepteur que l'interface lui-même :
var g2 greeter = &t2 // works because *tourGuide implements greeter's pointer receiver methods // illegal: t1 is not assignable to g1 // var g1 greeter = t1 // error: cannot use tourGuide as type greeter in assignment because tourGuide does not implement greeter (hello method has value receiver)
Alors, pourquoi t1 ne peut-il pas implémenter l'interface greeter ?
La raison est que la méthode hello() dans l'interface greeter a un récepteur de pointeur, ce qui signifie qu'il attend un pointeur vers une valeur tourGuide en tant que récepteur. Cependant, t1 est une variable (pas un pointeur). Même si les variables de valeur sont adressables, les valeurs d'interface contiennent des copies des valeurs stockées, pas des références. Par conséquent, lors de l'attribution d'une variable de valeur à une variable d'interface, cela crée une nouvelle copie qui ne peut pas être déréférencée et transmise en tant que récepteur pour les méthodes de récepteur de pointeur.
En résumé, lors de l'implémentation d'interfaces avec des méthodes de récepteur de pointeur, seuls les pointeurs au type d’implémentation peut satisfaire l’interface. Les variables ou copies de valeur ne sont pas attribuables à de telles interfaces car elles ne peuvent pas fournir le type de récepteur de pointeur requis.
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!