Schnittstellen mit nicht exportierten Methoden paketübergreifend implementieren
In Go erfordert die Implementierung einer Schnittstelle normalerweise die Definition exportierter Methoden, die mit der Signatur der Schnittstelle übereinstimmen. Es gibt jedoch Szenarien, in denen die Aufrechterhaltung der Zugänglichkeit der Implementierung unerwünscht ist. In diesem Artikel wird die Machbarkeit der Implementierung von Schnittstellen mit nicht exportierten Methoden in separaten Paketen untersucht.
Betrachten Sie den folgenden Codeausschnitt, in dem die Implementierung des Buchhaltungssystems (accountingsystem) in einem nicht exportierten Typ versteckt ist:
package accounting import "errors" type IAdapter interface { getInvoice() error } var adapter IAdapter func SetAdapter(a IAdapter) { adapter = a } func GetInvoice() error { if (adapter == nil) { return errors.New("No adapter set!") } return adapter.getInvoice() } package accountingsystem type Adapter struct {} func (a Adapter) getInvoice() error {return nil}
Leider erzeugt dieser Ansatz einen Kompilierungsfehler, da die nicht exportierte getInvoice()-Methode aus dem Accountingsystem-Paket für nicht sichtbar ist das Buchhaltungspaket.
Alternative Ansätze
Anonyme Strukturfelder:
Eine Lösung besteht darin, die Schnittstelle mithilfe eines anonymen zu implementieren struct-Feld im Paket der Schnittstelle. Dadurch kann die Schnittstelle erfüllt werden, ohne dass die Implementierung offengelegt wird:
package accounting type IAdapter interface { GetInvoice() error } type Adapter struct { IAdapter } func (*Adapter) GetInvoice() error { // Custom implementation }
Einrichtungsfunktion:
Alternativ können Sie durch Registrierung eine separate Funktion zum Einrichten des Adapters erstellen der nicht exportierte Typ als Adapter:
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() }
Dieser Ansatz ermöglicht es Ihnen, den Typ des Adapters privat zu halten, während Sie die Registrierung delegieren Prozess zu einer anderen Funktion.
Das obige ist der detaillierte Inhalt vonKönnen Go-Schnittstellen mit nicht exportierten Methoden paketübergreifend implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!