
Comprendre la non-concordance du type de retour de la méthode d'interface
Message d'erreur :
1 2 | cannot use &f (type *Bar) as type StringerGetter in argument to
Printer: *Bar does not implement StringerGetter (wrong type for GetStringer method) have GetStringer() *Foo want GetStringer() fmt.Stringer
|
Copier après la connexion
Dans Go, les méthodes d'interface reposent sur correspondance exacte du type. Cela signifie qu'une fonction renvoyant une interface doit avoir exactement le même type dans l'interface et dans son implémentation. S'ils ne correspondent pas, Go générera une erreur de compilation.
Dans ce cas, votre interface StringerGetter spécifie une méthode GetStringer() qui renvoie un fmt.Stringer. Cependant, l'implémentation de GetStringer() par votre type concret Bar renvoie un pointeur vers une structure Foo, qui n'est pas un fmt.Stringer. Cette incompatibilité provoque l'erreur de compilation.
Solutions :
-
Implémenter l'interface exactement :
- Modifiez la méthode GetStringer() dans Bar pour renvoyer directement un fmt.Stringer.
-
Enveloppez le type concret dans un nouveau type :
- Créez un nouveau type, tel que MyBar, qui intègre Bar et implémente StringerGetter à l'aide de la méthode GetStringer() intégrée de Bar. Cela vous permet de vous conformer à l'interface tout en conservant la fonctionnalité de Bar.
-
Utiliser l'assertion :
- Affirmer le type de béton Barre pour taper fmt.Stringer avant de le renvoyer depuis la méthode GetStringer(). Notez que cette solution a des implications potentielles en termes de performances et d'exécution.
Considérations importantes :
- Les interfaces spécifient uniquement les signatures de méthode, pas des implémentations de méthodes.
- Si un type concret implémente une méthode avec une signature différente de celle requise par une interface, il n'est pas considéré comme une implémentation de l'interface.
- Les assertions de type peuvent être utiles dans certains scénarios , mais doit être utilisé avec prudence pour éviter les erreurs d'exécution et les surcharges de performances.
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!