2010-05-21 7 views
5

Es ist eine lange Zeit her, seit ich in C++ programmiert habe, aber ich weiß, dass in C++ die Klassen in .h-Dateien und .cpp-Dateien organisiert sind. Auch viele andere Sprachen profitieren von der Aufteilung von Code in logische Gruppierungen innerhalb einer Verzeichnisstruktur, um die Organisation zu verbessern.Der beste Weg, um eine Go-Schnittstelle zu organisieren

Nun, ich versuche zu lernen, gehen Sie jetzt und ich las über die Go for C++ Programmers Artikel, wenn ich auf Schnittstellen stieß. Der Artikel erklärt, dass Schnittstellen in Go im Wesentlichen den Platz von Klassen einnehmen und zeigen, wie man sie gut einrichtet.

Was ich herausfinden möchte ist, wie sollte ich eine Schnittstelle in Dateien organisieren? Sollte sich beispielsweise die Schnittstelle in einer Datei befinden, während sich die Implementierung in einer anderen befindet?

myInterface.go

type myInterface interface { 
    get() int 
    set(i int) 
} 


myImplementation.go

type myType struct { i int } 
func (p *myType) set(i int) { p.i = i } 
func (p *myType) get() int { return p.i } 

hier Mein Code falsch sein kann, da ich nicht ganz weiß, was ich noch mache (und wenn ich bin falsch, bitte korrigieren Sie mich), aber wäre dies der beste Weg, dies einzurichten? Ich habe eine sehr harte Zeit zu versuchen, meinen Kopf einzuwickeln, wie man Code in Go organisiert, so dass jede Hilfe geschätzt wird!

Metropole

+0

Ich bin sehr spät in der Show. Aber ich folge normalerweise Quellcode-Stil: https://golang.org/src –

Antwort

5

Es ist nicht notwendig, Typen und Schnittstellen in separaten Dateien zu speichern. Die Sachen, die von jedem Paket exportiert werden, sind wichtig, und Sie bezeichnen diese, indem Sie den Namen mit einem Großbuchstaben beginnen. In C & co. Was in eine Header-Datei hineingeht, ist wichtig, weil das "importiert" wird (inklusive). In Go ist es das Paket, das importiert wird, und es spielt keine Rolle, wie sein Inhalt in verschiedenen Quelldateien organisiert ist (für den Importeur ist es sowieso nicht sichtbar).

Meine persönliche Empfehlung ist es, unnötige Dateien zu vermeiden. Wenn der Code relativ kurz ist, bewahren Sie ihn in einer Datei auf. Wenn es lang ist, dann überlegen Sie sich, Teile abzuzweigen, für die es sich natürlich anfühlt (z. B. Schnittstellen + verwandte Funktionen, die wahrscheinlich eine separate Klasse bilden würden, wenn Sie es in Java oder C++ tun würden). Zerlegen Sie nichts, nur um Definitionen vom Code zu trennen. es macht keinen Sinn in Go, obwohl es in C.

+0

Vielen Dank für die Info Arkku. Der Grund, warum ich diese Frage stelle, ist, weil ich sehr besorgt bin, dass Go ein Funktionsfest wird. Ich möchte nicht 20 Funktionen auf einer Seite haben, weil ich denken würde, dass das schwer zu bewältigen wäre. Aber auf der anderen Seite wird Go vielleicht eher so programmiert? – Metropolis

+0

Ich glaube nicht, dass die Länge einer Quelldatei von großer Bedeutung ist, solange ihr Inhalt zusammengehört, z. In Java befindet sich alles, was in einer Klasse ist, in dieser einen Datei. Wenn etwas in diese Klasse gehört, ist das kein Problem und es wäre sehr verwirrend, es willkürlich in eine separate Datei zu zerlegen (wenn das in Java möglich wäre). – Arkku

+0

Ich denke, ich hätte meine Frage wirklich neu formulieren sollen. Können Sie mir eine Art Go-Dateistruktur geben, die so organisiert ist, dass ich sehen kann, wie Dateien miteinander interagieren können? Alles, was ich bisher von Beispielen gesehen habe, ist eine Hauptfunktion und eine Menge anderer Funktionen in derselben Datei, die sich gegenseitig anrufen. Das ist großartig für Beispiele, aber in einer besser organisierten Umgebung denke ich, dass das schlecht wäre. – Metropolis

6

Die Sprache Go-Programmierung ist nicht C++, noch ist es C. es wie eine neue Sprache zu nähern. Go hat keine Entsprechung zu Headerdateien. Es hat nur eine lose Assoziation mit dem C++ -Konzept von Klassen. Da Sie kein Experte C++ - Programmierer sind, ignorieren Sie den Go For C++ Programmers Artikel.

Beginnen Sie mit dem Lesen A Tutorial for the Go Programming Language. Dann lesen Sie Effective Go. Stöbern Sie durch The Go Programming Language Specification, damit Sie wissen, wo Sie nachschlagen müssen.

Go ist Open Source, also schauen Sie sich Real Go package documentation und source code an.

Um zu beginnen, schauen Sie sich die time Paket documentation und source code, die von den Autoren von Go geschrieben wurde. Sie verwenden keine separaten Dateien für Schnittstellendeklarationen und Implementierungen, also warum möchten Sie? Wie Sie selbst sagen, wissen Sie nicht, was Sie gerade tun, also warum nicht zuerst dem Beispiel von Experten folgen?

Einige der Motivation für die Entwicklung der Go-Programmiersprache kam aus dem Wunsch, Sprache zu schaffen, die besser als C und viel einfacher als C++ war. Unter Berücksichtigung der verfahrenstechnischen Eigenschaften (oft C wie) von Go sind prozedurale Designkonzepte wie Kopplung und Kohäsion sinnvoll. Diese Konzepte werden bei der Partitionierung des Go time-Pakets in mehrere Quelldateien offensichtlich. Einige Klassenentwurfskonzepte werden ebenfalls nützlich sein, aber denken Sie daran, dass Go die Vererbung nicht unterstützt.

Wie Nicklaus Wirth in seiner klassischen Arbeit Program Development by Stepwise Refinement hervorhebt, sind frühe Entwürfe eines Programms selten ideal, manchmal sogar schlampig. Selbst die endgültige Version ist selten perfekt. Zum Beispiel haben die Go-Autoren das Go json-Paket kürzlich nach nur wenigen Monaten neu geschrieben.

Das Design und die Implementierung der Go-Programmiersprache eignet sich für die Verwendung vieler kleiner Funktionen. Es begünstigt prägnante Lösungen.Natürlich sind viele der Funktionen nicht außerhalb des Pakets verfügbar. Willkürliche Beschränkungen der Funktionsgröße oder -anzahl funktionieren in kaum einer Sprache.

Go-Programme werden erstellt, indem zusammen Pakete verbunden werden. Ein Paket wiederum Dateien aus einem oder mehrere Quell aufgebaut, die zusammen Konstanten deklarieren, Typen, Variablen und Funktionen zu dem Paket gehören, und welche zugänglich in allen Dateien des gleichen Pakets. Diese Elemente können exportiert und in einem anderen Paket verwendet werden.

Was möchten Sie mit Ihrem ersten Go-Paket tun? Stellen Sie spezifische Fragen, die beantwortet werden können, und geben Sie Details an.

+0

Ich habe nicht gesagt, es war C++ oder C ..... Ich weiß, es hat keine gleichwertige Header-Dateien, ich weiß auch, es ist eine lose Verbindung mit C++ - Konzepten ... Meine Frage war, "Was ist der beste Weg, Schnittstellen/Code in Go zu organisieren" – Metropolis

+0

Ich verwendete einfach C++ - Header-Dateien als etwas, um es zu vergleichen, da der Artikel über diesen Vergleich ist. – Metropolis

+0

Danke für die zusätzliche Information Peter, die geholfen hat. Ich denke, ich muss nur einen Weg finden, um von meiner Objekt (Klassen) orientierten Denkweise zu etwas anderem zu gelangen, und ich bin sehr besorgt, dass es schlampig herauskommen wird. Ich HATE schreiben schlampigen Code .... als ich sicher bin, dass viele von uns ... – Metropolis