Heim > Backend-Entwicklung > Golang > Wie gehe ich mit identischen Methodensignaturen in verschiedenen Paketen in Go um?

Wie gehe ich mit identischen Methodensignaturen in verschiedenen Paketen in Go um?

Mary-Kate Olsen
Freigeben: 2024-11-03 05:07:30
Original
607 Leute haben es durchsucht

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

Handhabung von Schnittstellen mit identischen Methodensignaturen über verschiedene Pakete hinweg

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage