Los geht's Golang Code Organisation

Go ist eine besondere Sprache unter den modernen Sprachen. Es ist sehr meinungsstark. Zum Beispiel gibt es eine echte Formatierung. Go sagt Ihnen, wie Sie Ihren Code platzieren und wo Sie Ihre geschweiften Klammern anbringen. Aber es geht viel tiefer. 

Go informiert Sie auch darüber, wie Sie Ihre Funktionen und Variablen für den öffentlichen oder privaten Zugriff nutzen können. Es gibt die Verzeichnisstruktur Ihres Codes vor. Dies kann für Entwickler, die aus liberaleren Programmiersprachen kommen, eine Überraschung sein. 

In diesem Artikel werde ich einige Einschränkungen von Go erkunden, ihre Vorzüge besprechen und Optionen für häufige Situationen vorschlagen.

Go ist eine unglaublich mächtige Programmiersprache. Sie lernen alles vom Schreiben einfacher Hilfsprogramme bis zum Erstellen von skalierbaren, flexiblen Webservern in unserem gesamten Kurs.

Projekt Euler

Als ich angefangen habe, Go zu lernen, habe ich eine Lösung für Problem # 6 erstellt und es in ein Unterverzeichnis gestellt, zusammen mit Lösungen für andere Probleme in anderen Sprachen. Siehe Projekt Euler.

Das Problem ist, dass Go nicht will, dass Sie Go-Dateien einfach zufällig überall verteilen. Später erkannte ich, dass dies zwar in sehr einfachen Fällen funktioniert, in denen Sie keine anderen Pakete importieren, aber nicht richtig ist.

Abhängigkeiten

Jedes nicht triviale Programm besteht aus mehreren Dateien oder Modulen oder Komponenten oder Klassen. Ich verwende einfach "Datei" als allgemeinen Begriff. Sie werden häufig in Bibliotheken oder Paketen oder Baugruppen zusammengefasst. Ich verwende einfach "package" als allgemeinen Begriff. Der Code, den Sie schreiben, hängt vom Code in anderen Dateien und Paketen ab. 

Sie müssen Ihrem Code mitteilen, wie er diese Pakete und Dateien findet, um deren Funktionalität nutzen zu können. Jede Sprache hat einen eigenen Begriff: Import, Include, Required. Ich verwende einfach "Import" als allgemeinen Begriff.

In einigen Sprachen (oder sprachspezifischen Tools) können Sie auch Abhängigkeiten von einem Remote-Paket-Repository installieren und an einem lokalen Standardspeicherort installieren, von dem Sie importieren können.

In den meisten gängigen Programmiersprachen haben Sie viel Freiheit. In C / C ++ teilen Sie dem Compiler / Linker mit, wo sich die Dateien und statischen Bibliotheken befinden (mithilfe von Befehlszeilenschaltern oder Umgebungsvariablen wie INCLUDE_DIR). In Python können Sie Pakete von PyPI mithilfe von setup.py oder mit pip von PyPI und Remote-Quellcodeverwaltungs-Repositorys installieren. Sie importieren dann basierend auf dem Suchpfad des Pakets sys.path.

Der Gehweg

Go ist wie immer präskriptiver. Es kann Ihre Kreativität beleidigen, dass Sie nicht so viel darüber sagen, wo Sie etwas platzieren müssen, aber am Ende des Tages spielt es keine Rolle, und es gibt genügend Flexibilität, um sich an verschiedene Situationen anzupassen.

Go setzt voraus, dass Sie Ihren Code in einem Arbeitsbereich ablegen. Ein Arbeitsbereich ist nur ein Verzeichnis mit drei Unterverzeichnissen: src, pkg und bin. Es wird empfohlen, alle Ihre Projekte in einem einzigen Arbeitsbereich zu speichern. Auf diese Weise können sie sich aufeinander verlassen und gemeinsame Pakete von Drittanbietern nutzen.

Hinweis: Ich arbeite derzeit unter Windows und verwende PowerShell für viele der interaktiven Beispiele. Für den folgenden Abschnitt wollte ich die Verzeichnisstruktur meines Arbeitsbereichs mithilfe von anzeigen Baum Befehl. Windows hat einen eigenen tree.exe-Befehl, der jedoch sehr begrenzt ist (keine Stufen). Es gibt angeblich einen vollwertigen Baumbefehl für Windows Hier

Aber die Seite war nicht erreichbar. Am Ende feuerte ich einen Docker-Container ab, der Ubuntu ausführte, meinen Go-Arbeitsbereich als / docs / Go einbindete und den Linux-Tree-Befehl verwendete, um ihn anzuzeigen. Seien Sie also nicht verwirrt, wenn Sie eine Linux-Umgebung sehen, die Windows-Verzeichnisse und -Dateien mit .exe-Suffixen anzeigt.

Hier ist mein aktueller Go-Arbeitsbereich. Das Behälter Das Verzeichnis enthält verschiedene Go-Befehle / tools und den Delve-Debugger. Das pkg dir hat ein Unterverzeichnis mit der Plattform (Win 64), das die Pakete nach ihrem Ursprung (github.com, golang.com usw.) enthält. Das src Das Verzeichnis hat ähnliche Unterverzeichnisse für das Ursprungsrepository oder die Website (github.com, golang.org usw.)..

root @ 67bd4824f9d5: / docs / Go # tree -n -L 3 | - bin | dlv.exe | go-outline.exe | go-symbols.exe | | - gocode.exe | | - godef.exe | | - golint.exe | gometalinter.exe | | - gopkgs.exe | | - gorename.exe | goreturns.exe | '- guru.exe | - pkg | '- windows_amd64 | github.com | golang.org | | - gopkg.in | '- sourcegraph.com' - src | - github.com | alecthomas | derekparker | go-web-crawler | golang | google | lukehoban | | - multi-git | | newhook | | - nsf | | - rogpeppe | | - tpng | '- x | - golang.org | '- x | - gopkg.in | '- alecthomas' - sourcegraph.com '- sqs 27 Verzeichnisse, 11 Dateien 

Werfen wir einen Blick in eines der Quellprojekte, die ich unter erstellt habe src: der go-web-Crawler. Hier ist es ziemlich einfach: Nur eine flache Liste von Go-Dateien, eine Lizenz und eine README-Datei.

root @ 67bd4824f9d5: / docs / Go # tree src / github.com / go-web-crawler / -n src / github.com / go-web-crawler / | - LIZENZ - README.md | - channel_crawl .go | - main.go '- sync_map_crawl.go 0 Verzeichnisse, 5 Dateien

GOROOT und GOPATH

Zwei Umgebungsvariablen steuern Ihr Schicksal im Land von Go. GOROOT Hier ist die Go-Installation:

09:21:26 C: \ Benutzer \ the_g \ Documents \ Go> ls Env: \ GOROOT Name Wert ---- ----- GOROOT C: \ Go \ 09:21:35 C: \ Users \ the_g \ Dokumente \ Los> ls c: \ go Verzeichnis: C: \ go Modus LastWriteTime Länge Name ---- ------------- ------ ---- d --- - 16.08.2016 10:38 Uhr api d ----- 16.08.2016 10:38 Uhr bin d ----- 16.08.2016 10:38 Uhr blog d ----- 16.08.2016 10:38 Uhr doc d ----- 16.08.2016 10:38 Uhr lib d ----- 16.08.2016 10:38 Uhr misc d ----- 8 / 16/2016 10:38 Uhr pkg d ----- 16.08.2016 10:38 Uhr src d ----- 16.08.2016 10:38 Uhr test -a ---- 8/16 / 2016 13:48 29041 AUTOREN -a ---- 16.08.2016 13:48 Uhr 1168 CONTRIBUT -a ---- 16.08.2016 13:48 40192 CONTRIBUT -a ---- 8/16 / 2016 13:48 Uhr 1150 favicon.i -a ---- 16.08.2016 13:48 Uhr 1479 LIZENZ --a ---- 16.08.2016 13:48 Uhr 1303 PATENTEN -a ---- 16.8.2016 13:48 Uhr 1638 README.md -a ---- 16.08.2016 13:48 Uhr 26 robots.tx -a ---- 16.08.2016 13:48 Uhr 5 VERSION 

Beachten Sie, dass das Go-Stammverzeichnis wie eine Obermenge eines Arbeitsbereichs mit den Verzeichnissen src, bin und pkg aussieht.

GOPATH zeigt auf Ihren Arbeitsbereich. So findet Go Ihren Code.

09:21:53 C: \ Benutzer \ the_g \ Documents \ Go> ls Env: \ GOPATH Name Wert ---- ----- GOPATH c: \ Users \ the_g \ Documents \ Go 

Es gibt eine Reihe anderer Go-abhängiger Umgebungsvariablen, von denen Sie in der Vergangenheit viele festlegen mussten (z. GOOS und GOARCH). Sie sind jetzt optional, und Sie sollten sich nicht damit beschäftigen, es sei denn, Sie müssen es wirklich tun (z. B. beim Cross-Compilieren). Um alle Go-Umgebungsvariablen anzuzeigen, geben Sie Folgendes ein: geh env.

09:51:10 C: \ Users \ the_g> go Umgebung set GOARCH = amd64 set GOBIN = set GOEXE = .exe set GOHOSTARCH = amd64 set GOHOSTOS = Fenster setzen GOOS = windows set GOPATH = c: \ Benutzer \ the_g \ Documents \ Go set GORACE = set GOROOT = C: \ Go set GOTOOLDIR = C: \ Go \ pkg \ tool \ windows_amd64 set CC = gcc set GOGCCFLAGS = -m64 -mthreads -fmessage-length = 0 set CXX = g ++ set CGO_ENABLED = 1

Installiert und importiert

Wenn Sie ein Go-Programm oder eine Bibliothek erstellen, können Sie es installieren. Programme gehen in Ihren Arbeitsbereich Behälter Verzeichnis und Bibliotheken gehen in den Arbeitsbereich pkg Verzeichnis. Unter Windows habe ich festgestellt, dass Ihr % GOPATH% / bin ist nicht in der %PFAD% Windows konnte meine ausführbare Datei nicht finden. Ich habe es dem Windows-Pfad hinzugefügt und alles hat funktioniert. So überprüfen Sie in PowerShell, ob Ihr PATH Ihr Bin-Verzeichnis für den Arbeitsbereich enthält:

10:56:19 C: \ Users \ the_g> $ env: path.split (";") | grep go C: \ Go \ bin c: \ Benutzer \ the_g \ Documents \ Go \ bin 

Lass uns das alles in Aktion sehen.

Wenn ich in mein go-web-crawler-Verzeichnis gehe, tippe Installieren Sie dann wird go-web-crawler.exe in erstellt c: \ Benutzer \ the_g \ Documents \ Go \ bin:

11:09:18 C: \ Users \ the_g> ls $ env: GOPATH / bin Verzeichnis: C: \ Users \ the_g \ Documents \ Go \ bin Modus LastWriteTime Länge Name ---- --------- ---- ------ ---- -a ---- 15.08.2016 11:05 Uhr 15891456 dlv.exe -a ---- 15.08.2016 10:08 Uhr 3972608 go -outline.exe -a ---- 15.08.2016 10:10 Uhr 4502528 go-symbols.exe -a ---- 18.09.2016 10:14 Uhr 1849856 go-web-crawler.exe -a ---- 15.08.2016 10:08 Uhr 12097024 gocode.exe -a ---- 15.08.2016 10:17 Uhr 6642688 godef.exe -a ---- 15.08.2016 9:32 Uhr AM 6625792 golint.exe -a ---- 15.08.2016 10:14 AM 6352896 gometalinter.exe -a ---- 15.08.2016 10:10 Uhr 2738688 gopkgs.exe -a ---- 8 / 15/2016 10:10 AM 6961152 gorename.exe -a ---- 15.08.2016 10:09 Uhr 7291904 goreturns.exe -a ---- 15.08.2016 10:11 Uhr 9722368 guru.exe 

Ich kann es jetzt von meinem Go-Web-Crawler aus ausführen.

11:10:32 C: \ Users \ the_g> go-web-crawler.exe gefunden: http://golang.org/ "Go-Programmiersprache" gefunden: http://golang.org/cmd/ "" nicht gefunden: http://golang.org/cmd/ gefunden: http://golang.org/pkg/ "Pakete" gefunden: http://golang.org/pkg/os/ "Package os" gefunden: http: / /golang.org/pkg/fmt/ "Package fmt" gefunden: http://golang.org/ "Die Programmiersprache Go"

Mehrere Go-Umgebungen

Das ist alles in Ordnung, aber manchmal ist das Leben nicht so einfach. Möglicherweise möchten Sie mehrere separate Arbeitsbereiche haben. Außerdem möchten Sie möglicherweise mehrere Go-Installationen (z. B. verschiedene Versionen) und mehrere Arbeitsbereiche für jede Installation. Sie können dies durch dynamische Einstellung tun GOPATH zum Ändern des Arbeitsbereichs und der Einstellungen GOROOT zum Ändern der aktiven Go-Installation.

Es gibt verschiedene Open-Source-Projekte für Vendoring, Paketverwaltung und virtuelle Umgebungen. Aus irgendeinem Grund unterstützen die meisten Windows nicht. Ich bin nicht sicher, warum solche Tools plattformspezifisch sein müssen. Ich kann vielleicht selbst einen plattformübergreifenden Go-Umgebungsmanager schreiben.

Fazit

Bei Go geht es darum, zufällige Komplexität zu beseitigen. Manchmal wirkt es sehr streng und verbindlich. Wenn Sie jedoch in die Denkweise der Go-Designer geraten, beginnen Sie zu verstehen, dass das Vermeiden, Verbieten oder Erzwingen bestimmter Dinge alles wirklich einfacher macht.