Heim  >  Artikel  >  Backend-Entwicklung  >  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
Mary-Kate OlsenOriginal
2024-11-03 05:07:30566Durchsuche

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>

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!

Stellungnahme:
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