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!