Go-Tutorial: Beginnen Sie mit Google Go

Warum sollten Sie die Go-Sprache verwenden? Grundsätzlich handelt es sich um eine übersichtliche, einfache, sichere und schnell kompilierte Sprache mit wunderbaren Parallelitätsfunktionen, die große Projekte problemlos abwickelt. Es ist auch kostenlos Open Source, obwohl es ursprünglich bei Google entwickelt wurde.

Rob Pike, einer der Designer der Sprache, erklärte: „Ziel des Go-Projekts war es, die Langsamkeit und Ungeschicklichkeit der Softwareentwicklung bei Google zu beseitigen und damit den Prozess produktiver und skalierbarer zu machen. Die Sprache wurde von und für Personen entwickelt, die große Softwaresysteme schreiben, lesen, debuggen und warten. “

In Übereinstimmung mit diesen Zielen fehlen Go viele Funktionen einiger anderer prominenter Sprachen - und das ist tatsächlich eine Stärke. Go ist nicht objektorientiert, es gibt keine Header-Dateien oder Forward-Deklarationen, es gibt keine Typhierarchie, es gibt keine Überladung von Methoden oder Operatoren, es gibt keine Generika, es gibt keine Virtuelle Maschine für eine Laufzeit, es gibt keine Ausnahmen und es gibt keine Zusicherungen.

Auf der anderen Seite funktioniert das, was Go hat, recht gut. Es kann große Programme in wenigen Sekunden kompilieren. Es verfügt über Coroutinen mit geringem Overhead (sogenannte Goroutinen ), die effizient über Kanäle kommunizieren können . Es hat Schnittstellen und Schnittstellenzusammensetzung. Darüber hinaus unterstützt Go erstklassige Funktionen, Funktionen höherer Ordnung, benutzerdefinierte Funktionstypen, Funktionsliterale, Abschlüsse und mehrere Rückgabewerte - mit anderen Worten, es unterstützt einen funktionalen Programmierstil in einer stark typisierten Sprache.

Wenn Sie eine der oben genannten fehlenden Funktionen anfordern möchten, lesen Sie möglicherweise die Diskussion über Sprachänderungen in den häufig gestellten Fragen zur Go-Sprache: Die Antwort lautet normalerweise "Nein, weil ...". Im Allgemeinen sind die besten Go-Programme Von Grund auf neu entwickelt, um Go-Sprachfunktionen zu verwenden, anstatt wörtlich aus anderen Sprachen übersetzt zu werden, die andere Abstraktionen verwenden.

Installieren Sie Go

Die kurzen Anweisungen zur Installation von Go werden im Quell-Repository angezeigt. Sie können Binärversionen von Go für Windows, MacOS und Linux herunterladen oder Go von der Quelle installieren. Anweisungen zur Installation von Go from Source auf GitHub finden Sie.

Wenn Sie Go bereits installiert haben, sollten Sie die aktuelle Build-Version am Ende von //golang.org/ überprüfen und dann Ihre installierte Version über die Befehlszeile überprüfen:

$ go Version

Wenn Ihre Installation veraltet ist, laden Sie die aktuelle Version herunter und installieren Sie sie. Starten Sie alle geöffneten Eingabeaufforderungen (Windows) oder Terminals neu. Führen Sie erneut aus go versionund stellen Sie sicher, dass die Version Ihren Erwartungen entspricht. Andernfalls ist möglicherweise eine ältere Version von Go an einer anderen Stelle installiert, die entfernt werden muss.

(Nein, ich bin nicht paranoid. Ich habe es geschafft, mich in die von mir beschriebene Situation zu bringen, indem ich mit Homebrew eine Version und mit dem Standard-MacOS-Paket die nächste Version etwa einen Monat später installiert habe. Sie werden an verschiedenen Orten auf der Website installiert $PATH. Nachdem ich herausgefunden hatte, was passiert war, konnte ich die alte Version mit Homebrew deinstallieren.)

Eine andere Installationsoption ist die Verwendung von ActiveGo, wenn Sie Unterstützung und Entschädigung wünschen und zahlen können.

Sobald Sie den Go-Compiler und die Tools installiert haben, sollten Sie die Übung zum Kompilieren und Ausführen eines Go-Programms durchführen, wie im Abschnitt „Testen Sie Ihre Installation“ auf der Installationsseite beschrieben.

Richten Sie Ihre Go-Umgebung ein

Go - Programmierer normalerweise alle in einem Arbeitsbereich , ihren Code halten, mit bin, pkgund srcOrdnern. In jedem Ordner verfügen die Projekte normalerweise über Pfade, die sich auf Git-Repositorys beziehen, z. B. GitHub oder GitLab. Zum Beispiel behalte ich meinen gesamten Go-Sprachcode unter ~/workund setze meine GOPATHUmgebungsvariable auf $HOME/work. Der Pfad zu meinem Quellcode-Ordner "hello.go" lautet $GOPATH/src/github.com/meheller/hello.

Ich füge das GOPATH/binVerzeichnis auch meinem Pfad hinzu, um Go-Programme bequem aus einem beliebigen Verzeichnis ausführen zu können:

export GOPATH = $ HOME / work

export PATH = $ PATH: $ (go env GOPATH) / bin

Die Go-Sprachdienstprogramme werden GOPATHstandardmäßig installiert. Wenn Sie also das GOPATH/binVerzeichnis in den Pfad einfügen, können Sie und Go-fähige Editoren und IDEs diese leichter finden. Sie können die meisten Dienstprogramme installieren, $go get sobald Sie wissen, welche Sie benötigen und welche Repository-Pfade sie benötigen. Die Repositorys sind normalerweise mit einer Google-Suche leicht zu finden. In einigen Fällen installiert ein Editor-Plug-In für Go die Dienstprogramme (z gocode. B. ) automatisch.

Wenn Sie es nicht selbst einstellen, wird GOPATHstandardmäßig $HOME/gounter Unix und MacOS sowie %USERPROFILE%/gounter Windows verwendet.

Gehen Sie zu Sprachtools, Editoren und IDEs

Mehrere Go-Dienstprogramme werden als Teil des Pakets mit dem Compiler installiert. Andere können mit dem go getBefehl installiert werden . Die am häufigsten verwendeten Go-Befehlszeilenprogramme sind unten aufgeführt.

 
Name Zusammenfassung
go Verwaltet den Go-Quellcode und führt die anderen hier aufgeführten Befehle aus.
cgo Ermöglicht die Erstellung von Go-Paketen, die C-Code aufrufen.
cover Ein Programm zum Erstellen und Analysieren der von go test -coverprofile.
fix Findet Go-Programme, die alte Funktionen der Sprache und der Bibliotheken verwenden, und schreibt sie neu, um neuere zu verwenden.
fmt Formate Go-Pakete. Auch als unabhängiger gofmtBefehl mit allgemeineren Optionen verfügbar .
godoc Extrahiert und generiert Dokumentation für Go-Pakete.
vet Untersucht den Go-Quellcode und meldet verdächtige Konstrukte, z. B. PrintfAufrufe, deren Argumente nicht mit der Formatzeichenfolge übereinstimmen .

Der üblicher Weg , die meisten dieser Befehle des Aufrufs ist als Unterbefehle von gozum Beispiel go fmt. Andere müssen über den go toolUnterbefehl aufgerufen werden . Gibt bei meiner Installation go tooldie folgende Liste bekannter Tools zurück:

$ go Tool

addr2line

asm

Buildid

cgo

kompilieren

Startseite

dist

doc

Fix

Verknüpfung

nm

objdump

Pack

pprof

test2json

Tour

Spur

Tierarzt

Diese Tools sind als Teil der vollständigen Liste der Go-Befehle dokumentiert. Stellen Sie übrigens sicher, dass Ihre GOPATHEinstellung festgelegt ist, bevor Sie Go-Tools oder Go-Editor-Plug-Ins hinzufügen, die Go-Tools verwenden.

Das Go-Repository hat seit Version 1.4 keine Editor- oder IDE-Unterstützung mehr, aber es gibt viele von beiden, die sich mit Go auskennen, entweder sofort oder mit Add-In-Modulen. Ich habe viele davon in einem Artikel von 2017 besprochen. Es gibt auch eine inoffizielle Liste, die von der Golang-Community geführt wird.

Meine bevorzugten IDEs in Go-Sprache sind GoLand (siehe oben; seit dem Schreiben des Artikels im Jahr 2017 in Gogland umbenannt) und Komodo. Beide sind kostenpflichtige Produkte mit kostenlosen Testversionen.

Sie möchten das Delve for Go-Debugging installieren. Unter MacOS müssen Sie möglicherweise auch die Befehlszeilen-Dienstprogramme zu Xcode hinzufügen und möglicherweise einen Softlink hinzufügen debugserver, wie im Kommentar vom 5. Juni in der Liste der Delve-Probleme beschrieben. Durch das Laufen xcode-select --installwerden auch Probleme beim Finden behoben debugserver, wenn auch auf brutale Weise.

Meine bevorzugten Go-Aware-Editoren mit GUIs sind Atom und Visual Studio Code. beide sind kostenlos. Wenn Sie sich für Atom entscheiden, sollten Sie die Pakete go-plus und go-debug hinzufügen. Wenn Sie Visual Studio Code wählen, sollten Sie vscode-go hinzufügen.

Wenn Sie ein Hardcore-Vim- oder Emacs-Benutzer sind, bleiben Sie auf jeden Fall bei dem, was Sie wissen - nicht, dass ich Ihren Editor aus Ihren kalten, toten Händen herausholen könnte. Vim-go bietet Go-Sprachunterstützung für Vim und Go-mode bietet Go-Sprachunterstützung für Emacs.

Eine Tour von Go

Sie können einiges lernen, indem Sie "A Tour of Go" entweder online oder offline durchlaufen. Angenommen, Sie haben die lokale Installation des Go-Compilers und der Tools abgeschlossen, können Sie die Tour so installieren, dass sie lokal ausgeführt wird, indem Sie die beiden folgenden Befehle ausführen:

$ go get golang.org/x/tour/gotour

$ gotour

Die zweite Zeile sollte einen Webserver starten und ein Browserfenster öffnen. Dies sieht genauso aus wie die Online-Tour, läuft jedoch möglicherweise etwas schneller, da die Codebeispiele auf Ihrem eigenen Computer erstellt und ausgeführt werden. Drücken Sie im Befehlsfenster Strg-C, um den Server zu stoppen, wenn Sie fertig sind.

Die Tour ist in drei Abschnitte unterteilt. Ich möchte, dass Sie die gesamte Tour einschließlich der Tests durchlaufen, aber ich werde jeden Abschnitt unten als Übersicht zusammenfassen und Ihnen einige Fragen stellen. Ich gebe die Antworten auf meine Fragen am Ende des Artikels (kein Spähen!). 

Gehen Sie Sprachgrundlagen

Go Basics Lektion 1

Frage 1. In diesem Beispiel gibt es drei Pakete. Was sind sie und wie werden sie verwendet? Warum gibt das Programm immer die gleiche Nummer zurück, obwohl es eine randFunktion gibt?

Beachten Sie, dass ich Lektion 2 nicht aufgerufen habe. Überspringen Sie keine Lektionen, nur weil ich sie nicht kommentiert habe.

Go Basics Lektion 3

Wenn Sie dieses Beispiel ausführen, werden folgende Fehlermeldungen angezeigt:

prog.go: 9: 14: kann nicht auf den nicht exportierten Namen math.pi verweisen

prog.go: 9: 14: undefined: math.pi

Frage 2. Warum die Fehler? Wie können Sie das Programm reparieren?

Go Basics Lektion 4

Frage 3. Vergleichen Sie diese Erklärung mit der Entsprechung in C. Was ist anders?

Go Basics Lektion 8

Frage 4. Warum wirft dieses Programm keine Fehler?

Go Basics Lektion 10

Frage 5. Was ist die Art von k? Warum? Wenn der Typ nicht offensichtlich ist, lesen Sie in Lektion 11 nach, wie er angezeigt wird.

Go Basics Lektion 12

Diese Lektion beantwortet die Frage, die ich in Lektion 8 gestellt habe.

Go Flow Control Lektion 1

Frage 6. Wie unterscheidet sich das von der forSchleife in Ihrer Lieblingssprache? Denken Sie, dass die anderen Schleifenkonstrukte in Ihrer Lieblingssprache notwendig sind? Ändern die zusätzlichen Informationen in den nächsten drei Lektionen Ihre Meinung?

Go Flow Control Lektion 7

Bevor Sie dieses Programm ausführen, überprüfen Sie es am Schreibtisch und notieren Sie, was Ihrer Meinung nach gedruckt wird. Führen Sie das Programm aus. Warst du richtig? Wenn nicht, was hast du nicht verstanden?

Go Flow Control Lektion 8

Dies ist die Art von Übung, die Sie möglicherweise zu Beginn eines Whiteboard-Interviews erhalten. Nehmen Sie sich Zeit, während Sie es ausarbeiten. Sagen Sie, was Sie denken, während Sie das Problem lösen.

Frage 7. Der Rest des Abschnitts zur Flusskontrolle ist wichtig zu verstehen. Erklären Sie nach den Lektionen 9 bis 13 das Go switchund die deferAnweisungen so, wie es ein C-, Java- oder JavaScript-Programmierer tun könnte.

Gehen Sie zu mehr Typen Lektion 1

Bevor Sie dieses Programm ausführen, überprüfen Sie es am Schreibtisch und notieren Sie, was Ihrer Meinung nach gedruckt wird. Führen Sie das Programm aus. Warst du richtig? Wenn nicht, was hast du nicht verstanden?

Wie denkst du über Go mit Zeigern, aber nicht mit Zeigerarithmetik?

Arbeiten Sie den Abschnitt Weitere Typen durch, bis Sie zur Übung in Lektion 18 gelangen. Frage 8. Was haben Sie über Go-Arrays und -Schnitte gelernt? Beenden Sie nun die Übung.

Fahren Sie mit der Übung in Lektion 23 fort.

Frage 9. Erklären Sie einen Versuch map. Warum sollten Sie eine verwenden wollen?

Beenden Sie den Abschnitt Weitere Typen.

Frage 10. Kann Go trotz Kompilierung als funktionale Programmiersprache verwendet werden? Wann und warum würden Sie Verschlüsse verwenden?

Gehen Sie Methoden und Schnittstellen

Gehen Sie alle 25 Lektionen in diesem Abschnitt durch, beginnend mit //tour.golang.org/methods/1.

Frage 11. Wenn Sie fertig sind, erklären Sie, wie sich die Verwendung von Methoden und Schnittstellen durch Go von C ++ - Klassen unterscheidet. Welches gefällt dir besser? Warum?

Gehen Sie Parallelität

Die Goroutine ist eines der bestimmenden Merkmale von Go für Parallelität. Versuchen Sie in der ersten Lektion im Abschnitt zur Parallelität, das Programm (unten) zu überprüfen und aufzuschreiben, was Ihrer Meinung nach gedruckt wird.

Führen Sie das Programm aus. Warst du richtig? Erklären Sie, was tatsächlich passiert und warum.

Kanäle sind der Weg, um Goroutinen implizit zu synchronisieren. Versuchen Sie in der nächsten Lektion (unten) erneut, das Programm zu überprüfen, bevor Sie es ausführen.

Frage 12. Warum gibt es in diesem Beispiel nur einen Kanal, obwohl es zwei Goroutine-Anrufe gibt?

Mit der select-Anweisung kann eine Goroutine auf mehrere Kommunikationsvorgänge warten. In welcher Reihenfolge werden Anweisungen im folgenden Programm ausgeführt?

Die Übung zu äquivalenten Binärbäumen ist eine weitere Übung, die Sie möglicherweise in einem Whiteboard-Interview finden. Nehmen Sie sich Zeit und erklären Sie Ihr Denken, während Sie eine Lösung implementieren. Führen Sie die Übung zum Implementieren eines Webcrawlers genauso aus, als wären Sie in einem Interview.

Antworten auf Fragen

Antwort 1. Pakete werden durch die packageAnweisung für das aktuelle Programm und durch die importAnweisung für externe Pakete gekennzeichnet, die verwendet werden. In diesem einfachen Programm mainhandelt es sich um das eigene Paket des Programms, das importiert wird, fmtdamit es drucken und math/ oder randeine Zufallszahl generieren kann.

Die verschiedenen Methoden randbasieren auf der Uhrzeit, um Zufallszahlen zu generieren, aber die Zeit ist in der gotourUmgebung festgelegt. Suchen Sie als Folgeübung das Paket und die Methode, die die Uhrzeit melden (Hinweis: Schauen Sie hier, wenn Sie nicht weiterkommen), und drucken Sie damit die aktuelle Uhrzeit. Führen Sie dies mehrmals in der gotourUmgebung aus, erstellen Sie das Programm auch lokal und führen Sie es mehrmals auf Ihrem eigenen Computer aus.

Antwort 2. Exporte in Go müssen immer groß geschrieben werden, und die Sprache unterscheidet zwischen Groß- und Kleinschreibung. math.Piist die richtige Methode.

Antwort 3. In C / C ++ folgen Variablendeklarationen der Form (z. B. int i, j, k;), während in Go der Typ nach dem Variablennamen steht und weggelassen werden kann, solange der Typ abgeleitet werden kann. In C / C ++ steht der Rückgabetyp vor einem Funktionsnamen, während er in Go nach der Funktionsparameterliste und vor dem Funktionskörper steht. In C / C ++ sind nachfolgende Semikolons obligatorisch.

Antwort 4. Es werden keine Fehler ausgegeben, da Go-Variablen, die nicht anderweitig festgelegt sind, auf den Nullwert des Typs initialisiert werden, z . B. 0oder false. In C / C ++ kennzeichnet der Compiler nicht initialisierte Variablen.

Antwort 5.k ist eine Ganzzahl, da sie mit initialisiert wurde 3.