2016-06-21 6 views
1

Ich bin neu zu gehen. Ich habe bemerkt, dass es in einigen Bibliotheken öffentliche Methoden für eine private Struktur gibt. Siehe zum Beispiel https://github.com/btcsuite/btcd/blob/master/txscript/stack.goGolang öffentliche Methode zu private struct - ist dies irgendein Anwendungsfall

Ist dies ein echter Anwendungsfall. Ich kann mir nicht vorstellen, wie ich öffentliche Methoden verwenden kann, wenn ich nicht auch auf die Struktur zugreifen kann, der sie angehören.

Wie die folgende Frage - gibt es eine Möglichkeit, die private Deklaration einer Struktur zu überwinden. Zum Beispiel möchte ich den Strukturstapel aus der aufgespitzten Datei in meinem Paket verwenden.

Antwort

7

Der Hauptanwendungsfall dafür ist, dass Sie einen nicht exportierten Typ aus einer Paketfunktion zurückgeben können. Alle exportierten Methoden können dann für diesen Typ verwendet werden, obwohl andere Pakete den Typ erst gar nicht erstellen können (außer, dass sie als Rückgabewert von Ihrem Paket empfangen werden).

Der andere wichtige Anwendungsfall ist in Paket-Level-Schnittstellen. Ich neige dazu, ein ziemlich Standardmuster zu verwenden, wobei ein Paket eine exportierte Schnittstelle definiert, wie folgt aus:

type Doer interface { 
    Do() 
} 

und definiert dann einige private Art (en), die diese Schnittstelle erfüllt: externe

type stringDoer struct {} 

func (s *stringDoer) Do() {} 

func NewStringDoer() Doer { 
    return &stringDoer{} 
} 

auf diese Weise Pakete können meine Typen als Schnittstellen verwenden, ohne sich mit konkreten Typen herumschlagen zu müssen, und da die exponierten Datentypen meines Pakets vollständig Schnittstellen sind, macht es Mocking oder Stubbing-Aufrufe an mein Paket (zum Beispiel zum Testen) unglaublich einfach.

Damit dieser Systemtyp funktioniert, müssen die Methoden in der Struktur (in diesem Fall stringDoer) exportiert werden, selbst wenn die Struktur selbst nicht existiert.

1

Dies ist das Commit, das es exportiert: https://github.com/btcsuite/btcd/commit/7411e65b1e8d4e4c6da198590ad627bfe253173c. Von der Festschreibnachricht:

Diese Festschreibung gibt den Stack-Typ aus, da er nur intern während der Skriptausführung verwendet werden soll. Ferner stellt die Engine die Funktionen {G, S} etStack und {G, S} etAltStack zur Verfügung, die die Elemente als einen Abschnitt von Byte-Slices ([] [] Byte) für den Zugriff des Aufrufers während des Schritts zurückgeben.

Ich glaube, Sie haben Recht, dass Sie (außerhalb des Pakets) diese Struktur nicht nutzen können. Es wird rein innerhalb der Paketimplementierung verwendet.

+0

In Go ist es sehr üblich, eine private Implementierung einer öffentlichen Schnittstelle zurückzugeben. Dieses Muster wird in der gesamten stdlib verwendet. – JimB

Verwandte Themen