Heim > Backend-Entwicklung > Golang > Wie kann ich eine Schnittstelle mit nicht exportierten Methoden aus einem anderen Go-Paket implementieren?

Wie kann ich eine Schnittstelle mit nicht exportierten Methoden aus einem anderen Go-Paket implementieren?

Susan Sarandon
Freigeben: 2024-12-03 04:24:10
Original
647 Leute haben es durchsucht

How Can I Implement an Interface with Unexported Methods from Another Go Package?

Schnittstellen mit nicht exportierten Methoden aus anderen Paketen implementieren

In Go dienen Schnittstellen als Verträge, die eine Reihe von Methoden definieren, die von implementiert werden müssen jeder Typ, der daran haftet. Normalerweise werden die Methoden einer Schnittstelle exportiert, um den Zugriff von anderen Paketen aus zu ermöglichen. Es kann jedoch Szenarien geben, in denen Sie bestimmte Implementierungen vor dem verbrauchenden Programm ausblenden müssen.

Betrachten Sie das folgende Beispiel, in dem wir eine Schnittstelle für den Zugriff auf das Buchhaltungssystem definieren:

package accounting

import "errors"

type IAdapter interface {
    GetInvoice() error
}
Nach dem Login kopieren

Ausblenden Bei bestimmten Implementierungen machen wir die Schnittstellenmethoden nicht exportiert und führen Wrapper-Funktionen in das Basispaket ein, die die entsprechende Implementierung über eine aufrufen Adapter:

var adapter IAdapter

func SetAdapter(a IAdapter) {
    adapter = a
}

func GetInvoice() error {
    if (adapter == nil) {
        return errors.New("No adapter set!")
    }
    return adapter.GetInvoice()
}
Nach dem Login kopieren

Obwohl dieser Ansatz vielversprechend erscheint, tritt beim Versuch, die Schnittstelle in einem anderen Paket zu implementieren, ein Problem auf. Der Compiler beschwert sich darüber, dass er die nicht exportierte GetInvoice-Methode nicht sehen kann.

Dieses Problem ist auf die Art und Weise zurückzuführen, wie Schnittstellen in Go funktionieren. Eine Schnittstelle besteht nur aus den Methodensignaturen, ohne dass deren Implementierung bekannt ist. Wenn ein Typ eine Schnittstelle implementiert, muss er alle Methoden mit denselben Signaturen wie die Schnittstelle verfügbar machen.

Um diese Einschränkung zu überwinden, können wir anonyme Strukturfelder verwenden:

type Adapter struct {
    accounting.IAdapter
}
Nach dem Login kopieren

Dies ermöglicht Wir können die Schnittstelle in einem anderen Paket implementieren, indem wir sie anonym einbetten. Wir können jedoch keine benutzerdefinierten Implementierungen für die nicht exportierten Methoden bereitstellen.

Eine idiomatischere Lösung wäre die Bereitstellung einen nicht exportierten Adapter und stellen eine Registrierungsfunktion im Basispaket bereit:

package accounting

type IAdapter interface {
    GetInvoice() error
}

---

package accountingsystem

type adapter struct {}

func (a adapter) GetInvoice() error {return nil}  

func SetupAdapter() {
    accounting.SetAdapter(adapter{})
}

---

package main

func main() {
    accountingsystem.SetupAdapter()
}
Nach dem Login kopieren

Dieser Ansatz stellt sicher, dass der Adapter verborgen bleibt, ermöglicht aber dennoch die Registrierung einer entsprechenden Implementierung.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Schnittstelle mit nicht exportierten Methoden aus einem anderen Go-Paket implementieren?. 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