Maison >développement back-end >Golang >Comment gérer les signatures de méthodes identiques dans différents packages dans Go ?

Comment gérer les signatures de méthodes identiques dans différents packages dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 05:07:30653parcourir

How to Handle Identical Method Signatures Across Different Packages in Go?

Gestion des interfaces avec des signatures de méthode identiques dans différents packages

Dans Go, lorsque vous traitez plusieurs interfaces avec la même signature de méthode mais définies dans des packages distincts, des situations peuvent survenir où un type implémentant les deux interfaces conduit à un comportement inattendu.

Considérez ces deux interfaces (Doer) et fonctions (FuncA et FuncB) définies dans différents packages :

<code class="go">// Package A
type Doer interface { Do() string }
func FuncA(doer Doer)

// Package B
type Doer interface { Do() string }
func FuncB(doer Doer)</code>

Si un type C implémente Doer des deux packages et l'implémentation diffère :

<code class="go">// Package main
type C int
func (c C) Do() string { return "A-specific implementation" }

func main() {
    cA := C(0); A.FuncA(cA)
    cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations
}</code>

Pour résoudre ce problème, le système de types de Go met l'accent sur la correspondance par nom et la cohérence des types. Bien qu'elle permette à un objet de satisfaire plusieurs interfaces, l'implémentation de la méthode partagée doit respecter tous les contrats d'interface applicables.

Dans le scénario ci-dessus, une solution de contournement consiste à implémenter des types de wrapper :

<code class="go">// Package main
type DoerA struct { C C }
func (d DoerA) Do() string { return "A-specific implementation" }
type DoerB struct { C C }
func (d DoerB) Do() string { return "B-specific implementation" }

func main() {
    cA := DoerA{C(0)}; A.FuncA(cA)
    cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations
}</code>

En créant ces wrappers, vous pouvez contrôler l'implémentation de Do() en fonction de l'utilisation prévue de l'interface, garantissant ainsi la cohérence dans les contextes de package respectifs.

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