© Liashko/Shutterstock.com
Eine Einführung in die Programmierung mit Go

Stop and Go!


Unzufriedenheit ist der beste Motivator für Entwicklungstätigkeit. Die Sprache Go entstand, als Google-Mitarbeiter an die Grenzen der zur Verfügung stehenden Programmiersprachen Java und C++ stießen und nach einer besseren Alternative Ausschau hielten. Wir schauen uns die Sprache an, die vor allem im Hinblick auf skalierbare Netzwerkdienste und Cloud Computing entwickelt wurde.

Die neue Sprache sollte möglichst schnell zu direkten monetären Vorteilen führen. Diese Herangehensweise sorgte dafür, dass Go an Bekanntem und Vorhandenem ausgerichtet wurde. Das Produkt ist ein auf maximale Effizienz getrimmtes Arbeitswerkzeug, bei dessen Entwicklung die Bedürfnisse von produktiv arbeitenden Entwicklern im Mittelpunkt stehen.

Ein besonderes Feature ist die unter [1] spezifizierte lebenslange Kompatibilitätsgarantie. Das Entwicklerteam verpflichtet sich darin, für die gesamte Lebensdauer von Go 1.x Abwärtskompatibilität zu wahren: Es wird – anders als bei Ruby – auf absehbare Zeit keine Sprachänderungen geben, die „wohlverhaltenden“ Code betreffen.

Go herbei

Google bietet vorkompilierte Binärdateien für Windows, Mac OS und Linux an [2]. Aufgrund des Fokus auf Nebenläufigkeit ist es ratsam, erste Gehversuche auf einer mehrkernigen Maschine zu erledigen. Die folgenden Programmbeispiele entstanden auf einer vierkernigen AMD64-Workstation; als Betriebssystem kam Ubuntu 14.04 zum Einsatz.

Die Installation der Programmdateien ist nicht besonders komplex: Das Archiv wird an den von Google vorgeschlagenen Platz extrahiert, die Deklaration der unter [2] angeführten Pfad-Variable sorgt dafür, dass Skript und Co. die von Ihnen benötigten Werkzeuge ohne Probleme finden. Go funktioniert übrigens auch auf Einplatinencomputern mit ARM-Prozessor: Leider gibt es hier keine Binärdistribution, was das manuelle Kompilieren notwendig macht.

Leider ist das Bereitstellen der Compilerinfrastruktur nur die halbe Miete. Go setzt eine vergleichsweise komplexe Ordnerstruktur voraus. Wenn Ihr Code diesem Format nicht entspricht, so kommt es zu Compilerfehlern. Für die folgenden Beispiele erstellen Sie einen Verzeichnisbaum, der nach dem in Abbildung 1 gezeigten Schema aufgebaut ist.

hanna_go_1.tif_fmt1.jpgAbb. 1: Ein Go Workspace besteht aus drei Ordnern

Der eigentliche Quellcode Ihrer Solution befindet sich – logischerweise – im Verzeichnis /src. Jedes Projekt-paket liegt in einer eigenen Ordnerstruktur, die auf Wunsch auch aus einem Git oder Mercurial Repository bestehen kann. Von go install kompilierte Binärdateien landen in /bin/, während /pkg/ für die Aufnahme von Bibliotheken und Ähnlichem zuständig ist.

Go setzt das Vorhandensein der GOPATH-Umgebungsvariablen voraus, die auf das zu verwendende Workspace-Verzeichnis verweist. Da man mitunter mit mehreren Workspaces arbeitet, ist es sinnvoll, die Variable nach folgendem Schema im Rahmen der Erstellung des Terminals zu deklarieren:

export GOPATH=/home/farhan/Schreibtisch/TamsHaus/GoWorkspace 

Aus Gründen der Bequemlichkeit fügen manche Programmierer das /bin-Verzeichnis zum Path hinzu. Dieser optionale Schritt erleichtert das Ausführen der Kompilate, ist aber nicht unbedingt notwendig.

Go sagt Hallo

Seit Jahrzehnten ist die Ausgabe von „Hello World“ am Bildschirm das Standardeinführungsbeispiel. Unsere Variante fällt etwas komplizierter aus, da sie einige Besonderheiten der Programmiersprache vorstellen soll. Erstellen Sie in einem Unterordner von /src/ eine Datei namens SUSSample1.go und versehen Sie sie mit dem Inhalt aus Listing 1.

Listing 1

package main import "fmt" func doSomething(howManyTimes int) { for i := 0; i < howManyTimes; i = i + 1 { fmt.Printf("Hello, world.\n") } } func main() { doSomething(22) }

Go wird mit einem lexikalischen Scanner (auch To­ken­izer oder Lexer genannt) ausgeliefert, der die in C und Java manuell einzugebenden Semikolons automatisch generiert. Das manuelle Eingeben eines Semikolons ist nur dann notwendig, wenn Sie das Ende eines Kommandos „explizit“ angeben wollen. Ein Beispiel dafür findet sich in der in doSomething implementierten for-Schleife.

Dieses Verhalten beeinflusst die Platzierung von geschwungenen Klammern. Sowohl in C als auch in Java ist die folgende Schreibweise einer Selektion – bis auf das Fehlen der in Go nicht vorgesehenen Klammern – legitim:

if i < f() { g() }

Im Rahmen der Kompilation würde der Lexer nach dem Vergleich zwischen i und f ein Semikolon einfügen, was zu einem Compilerfehler führt. Die im Codebeispiel gezeigte Schreibweise mit dem Semikolon am „Ende“ des Parameters ist somit – nicht nur bei Funktionen – obligatorisch.

Deklarationen und mehr

Guido Krügers legendäres Lehrbuch zu C [3] enthielt eine Seite mit komplexen Deklarationen, deren Parsing auch erfahrene Entwickler vor arge Schwierigkeiten stellt. Go löst dieses Problem durch eine Anleihe bei Pascal: Der Variablenname kommt stets vor der Deklaration des Typs.

Zwecks Einsparung von unnötigen Eingabevorgängen wurden die in Pascal vorgesehenen Keywords samt dem Doppelpunkt ersatzlos gestrichen, was zur im Snippet demonstrierten Syntax führt:

x int p *int a [3]int

Pascal wird mit dem :=-Operator ausgeliefert, der für Zuweisungen zuständig ist. In Go ermöglicht er die Deklaration einer Variablen, deren Typ vom als Initialisierungswert verwendeten Parameter abhängig ist. Wir nutzen dies in der for-Schleife zur Erstellung der Laufvariable (for i := 0;). Go bleibt trotzdem eine streng typisierte Sprache. Der Lexer erkennt den Typ der zur Initialisierung verwendeten Konstante. Google spart dem Programmierer hier nur das explizite Eingeben des Typs.

In der Praxis führen die Optimierungen zu nicht unerheblichen Steigerungen der Lesbarkeit: Das bei C notwendige kreiselnde Interpretieren komplexerer Deklarationen entfällt [4].

Kompiliere mich

Komplexere Programme lassen sich durch Ausführung von go install kompilieren. Das Kommando kopiert das Resultat seiner Arbeit in den /bin-Ordner des Workspace. Da wir nur eine einzelne Datei erstellen müssen, ist das Overkill. Erfreulicherweise bietet der Go-Compiler mit build eine einfachere Variante an, die die Binärdatei im gerade aktuellen Verzeichnis ablegt:

farhan@FARHAN14:~/Schreibtisch/TamsHaus/GoWorkspace/src$ go build tamoggemon.com/susexample1/SUSExample1.go 

Go unterscheidet sich von anderen Programmiersprachen insofern, als die Spezifikation strenge Anweisungen über die Art der Formatierung enthält. Google liefert mit gofmt ein fertiges Werkzeug mit, das beliebigen Code in die kanonische Darstellung transformiert un...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang