Heim > Backend-Entwicklung > Golang > Wie implementiert man versteckte Schnittstellenmethoden in Go richtig?

Wie implementiert man versteckte Schnittstellenmethoden in Go richtig?

Barbara Streisand
Freigeben: 2024-11-30 02:21:09
Original
394 Leute haben es durchsucht

How to Properly Implement Hidden Interface Methods in Go?

Schnittstellen mit versteckten Methoden implementieren

Bei der Entwicklung eines Buchhaltungssystems kann es wünschenswert sein, bestimmte Implementierungen einer Schnittstelle vor dem Hauptprogramm zu verbergen um sicherzustellen, dass nur ein Buchhaltungssystem aktiv ist. Um dies zu erreichen, kann man erwägen, die Schnittstellenmethoden nicht zu exportieren und exportierte Funktionen zu erstellen, die eine Funktion von einem lokalen Adapter aufrufen.

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

Bei diesem Ansatz tritt jedoch ein Kompilierungsfehler auf, da der Compiler nicht auf die nicht exportierte getInvoice zugreifen kann Methode aus dem Accountingsystem-Paket.

cannot use adapter (type accountingsystem.Adapter) as type accounting.IAdapter in argument to accounting.SetAdapter:
accountingsystem.Adapter does not implement accounting.IAdapter (missing accounting.getInvoice method)
have accountingsystem.getInvoice() error
want accounting.getInvoice() error
Nach dem Login kopieren

Anonymes Strukturfeld Ansatz

Eine mögliche Lösung ist die Verwendung anonymer Strukturfelder. Dadurch kann der Accountingsystem.Adapter zwar die Accounting.IAdapter-Schnittstelle erfüllen, es wird jedoch verhindert, dass der Benutzer seine eigene Implementierung der nicht exportierten Methode bereitstellt.

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

Alternativer Ansatz

Ein idiomatischerer Ansatz besteht darin, einen nicht exportierten Adaptertyp zu erstellen und eine Funktion zum Registrieren des Adapters bei der Buchhaltung bereitzustellen Paket.

package accounting

type IAdapter interface {
    GetInvoice() error
}


package accountingsystem

type adapter struct {}

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

func SetupAdapter() {
    accounting.SetAdapter(adapter{})
}
Nach dem Login kopieren

Mit diesem Ansatz wird der Typ „accountingsystem.adapter“ vor dem Hauptprogramm ausgeblendet und das Buchhaltungssystem kann durch Aufrufen der SetupAdapter-Funktion initialisiert werden.

Das obige ist der detaillierte Inhalt vonWie implementiert man versteckte Schnittstellenmethoden in Go richtig?. 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