Maison > développement back-end > Golang > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-03 05:07:30
original
506 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!