Dans cet exemple, nous avons deux interfaces, A et B, et deux structures, C et D, qui les mettent en œuvre. Lorsque vous essayez de transmettre une instance de D à une fonction attendant un type qui implémente B, une erreur est rencontrée.
Les interfaces définissent les signatures de méthode auxquelles les types d'implémentation doivent adhérer. Une structure implémente une interface si elle possède des méthodes avec les mêmes signatures que celles de l'interface.
Le problème survient parce que la méthode Connect en D renvoie un pointeur à C au lieu de A. Selon l'interface B, la méthode Connect devrait renvoyer A. Cette incompatibilité empêche D d'implémenter complètement l'interface B.
Pour résoudre le problème, le type de retour de Connect dans D doit être modifié pour correspondre à la définition de l'interface :
type D struct { } func (d *D) Connect() (A, error) { // Returns A, not *C c := new(C) return c, nil }
Typage structurel de Go permet aux structures d'implémenter des interfaces sans les déclarer explicitement. Cela peut entraîner des erreurs si les méthodes de la structure ne correspondent pas aux signatures de l'interface.
Lors du passage d'un objet à une fonction attendant une interface, le type de l'objet doit implémenter cette interface. Dans le cas d'Equaler, le type d'argument d'Equal doit correspondre au type d'interface, pas simplement à un autre type de structure qui implémente également l'interface.
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!