In Go kann es beim Umgang mit mehreren Schnittstellen mit derselben Methodensignatur, die jedoch in separaten Paketen definiert sind, zu Situationen kommen, in denen Ein Typ, der beide Schnittstellen implementiert, führt zu unerwartetem Verhalten.
Betrachten Sie diese beiden Schnittstellen (Doer) und Funktionen (FuncA und FuncB), die in verschiedenen Paketen definiert sind:
<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>
Wenn ein Typ C Doer implementiert von beiden Paketen und die Implementierung unterscheidet sich:
<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>
Um dieses Problem zu beheben, legt das Typsystem von Go Wert auf Übereinstimmung nach Namen und Konsistenz in Typen. Während es einem Objekt ermöglicht, mehrere Schnittstellen zu erfüllen, muss die Implementierung der gemeinsam genutzten Methode alle geltenden Schnittstellenverträge einhalten.
Im obigen Szenario umfasst eine Problemumgehung die Implementierung von Wrapper-Typen:
<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>
Durch die Erstellung dieser Wrapper können Sie die Implementierung von Do() basierend auf der beabsichtigten Schnittstellennutzung steuern und so die Konsistenz innerhalb der jeweiligen Paketkontexte sicherstellen.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit identischen Methodensignaturen in verschiedenen Paketen in Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!