Maison  >  Article  >  développement back-end  >  Voici quelques options de titre, jouant avec le \'Pourquoi\' et le 'Comment\' de l'erreur : Accent sur le « Pourquoi » * Pourquoi mon code Go renvoie-t-il un \'ne peut pas être utilisé... comme type St

Voici quelques options de titre, jouant avec le \'Pourquoi\' et le 'Comment\' de l'erreur : Accent sur le « Pourquoi » * Pourquoi mon code Go renvoie-t-il un \'ne peut pas être utilisé... comme type St

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 05:25:031017parcourir

Here are a few title options,  playing with the

Comprendre la non-concordance du type de retour de la méthode d'interface

Message d'erreur :

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

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 :

  1. Implémenter l'interface exactement :

    • Modifiez la méthode GetStringer() dans Bar pour renvoyer directement un fmt.Stringer.
  2. 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.
  3. 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!

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