Heim > Backend-Entwicklung > Golang > Können Go-Schnittstellen mit nicht exportierten Methoden paketübergreifend implementiert werden?

Können Go-Schnittstellen mit nicht exportierten Methoden paketübergreifend implementiert werden?

DDD
Freigeben: 2024-11-27 21:27:09
Original
631 Leute haben es durchsucht

Can Go Interfaces Be Implemented with Unexported Methods Across Packages?

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

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage