Maison  >  Article  >  développement back-end  >  Comment puis-je renvoyer un type concret à partir d’une méthode d’interface dans Go ?

Comment puis-je renvoyer un type concret à partir d’une méthode d’interface dans Go ?

DDD
DDDoriginal
2024-10-26 22:23:03805parcourir

 How Can I Return a Concrete Type from an Interface Method in Go?

Méthode d'interface renvoyant une interface et des types concrets

Dans Go, une méthode d'interface renvoyant une interface offre une flexibilité pour les implémentations de types. Cependant, tenter d'implémenter une telle méthode avec un type concret peut entraîner des erreurs.

Considérons l'exemple :

<code class="go">func GetStringer() fmt.Stringer</code>

Où GetStringer est une méthode d'interface renvoyant l'interface fmt.Stringer.

Si un type concret, tel que Foo, est implémenté pour renvoyer une valeur de lui-même (*Foo), une erreur est rencontrée. En effet, Foo n'implémente pas directement fmt.Stringer.

Pour résoudre ce problème, plusieurs approches peuvent être adoptées :

Utilisation d'un type d'adaptateur

Créez un type d'adaptateur qui enveloppe le type de béton et est conforme à l'interface requise :

<code class="go">type MyBar struct{ Bar }

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.Bar.GetStringer()
}</code>

Cette approche permet une extension sans modifier le type Bar d'origine.

Enveloppement avec le Interface

Alternativement, le type concret peut être directement enveloppé avec l'interface requise :

<code class="go">func (b *Bar) GetStringer() fmt.Stringer {
    return &Foo{"foo"}
}</code>

Ici, le type concret Bar fournit une implémentation de la méthode GetStringer qui renvoie une instance du type Foo, qui implémente fmt.Stringer.

Les deux méthodes fournissent des options pour s'adapter aux retours de méthodes d'interface avec des types concrets dans Go. L'approche appropriée dépend des exigences spécifiques et de l'architecture du code.

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