Go macht Spass

Go macht Spass
Go macht Spass

Go mit Java zu vergleichen ist nicht fair. Das ist, wie eine junge, schlanke, ungeschminkte Frau mit einer in die Tage gekommenen, schwerfälligen, übergewichtigen und aufgetakelten Dame zu vergleichen. Also lassen wir das und fassen zusammen, was Go zu einer Spass-Sprache macht.

First published: 02/03/2021 | Last update: 09/03/2021

Der Satz "Perfektion wird nicht durch Hinzufügen, sondern durch Weglassen erreicht" beschreibt ziemlich genau das Designprinzip dieser Programmiersprache. Go verzichtet auf viele Dinge, die fester Bestandteil von anderen Sprachen ist, z. B. Exceptions. In diesem Fall ist der Grund dafür, dass Exceptions in vielen Sprachen so sehr zum Kontrollfluss benutzt werden, dass man kaum noch von "Ausnahme" sprechen kann. Vorreiter ist hier ohne Zweifel Python. Anstatt

if mydict.get['key1'] is not None:
    mydict['key1'].append('new_item')
else:
    mydict['key1'] = [new_item]

wird in Python folgende Schreibwese bevorzugt:

try:
     mydict['key1'].append('new_item')
except KeyError:
    mydict['key1'] = [new_item]

Dagegen ist ja nichts einzuwenden, aber braucht man das? Nö, eigentlich nicht. Daraus sollte man aber keinen Glaubenskrieg machen und so werde ich auch weiterhin Exceptions in Python genau so verwenden, wie ich es gewohnt bin. Statt Exception benutzt Go die Möglichkeit von Funktionen, mehrere Parameter zurückgeben zu können, so dass man einen speziellen Datentyp für Fehler zusätzlich zurückgeben kann.

Auch das Semikolon am Ende von Statements kann man weglassen, ein Zeilenumbruch reicht. Und mit Klammern ist Go sparsamer, als die meisten anderen Sprachen die sich syntaktisch an C anlehnen. Zum Beispiel braucht man den Ausdruck zur Kontrolle von Bedingungen oder Schleifen nich einzuklammen. Statt also

if (i == 42) {...}

reicht ein

if i == 42 {...}

Für Schleifen gilt das Gleiche, aus

for ( i := 0; i < 42; i++ ) {...}

wird

for   i := 0; i < 42  {...}

Wenn die Zählervariable einfach hochgezählt wird, kann man den Inkrement-Ausdruck weglassen, ansonsten reicht ein i += 3.

Ansonsten ist Go sparsam mit Shortcuts, was für gute Lesbarkeit sorgt, aber die, die es gibt, erleichtern das Schreiben von Code wirklich: innerhalb einer Funktion kann mit dem Operator := gleichzeitig mit der Wertzuweisung eine Variable deklariert werden. Damit fühlt sich Go fast so flüssig wie eine dynamisch typisierte Sprache an, ohne die Nachteile des Late Bindings in Kauf nehmen zu müssen.

Was mir ganz besonders gut gefällt, ist, wie Go Objektorientierung erlaubt, was ein wenig an die Art erinnert, wie Objekte in C umgesetzt werden, allerdings ohne die dazugehörigen Fallstricke. (Das ist kein Tippfehler, auch in C kann man einem objektorientierten Ansatz folgen, auch wenn C das syntaktisch nicht direkt unterstützt). Wobei man mit dem Wort Ojektorientierung vorsichtig sein muss, die Geister streiten sich, ob Go zu den Oo-Sprachen gezählt werden kann.

Structs beinhalten in Go nur Daten (oder Zeiger auf Daten). Es können aber Funktionen definiert werden, die auf die Daten zugreifen können und und später mit Punkt-Syntax aufgerufen werden können, wie bei einer normalen Oo-Sprache.

Vererbung wird nicht unterstützt und ich muss erhrlich sagen, dass ich sie nicht sonderlich vermisse. Polymorphie wird von Go durch Interfaces unterstützt. Allerdings braucht man bei der Implementierung eines Interfaces dies nicht expliziet anzugeben, es reicht wenn Reihenfolge und Datentypen mit dem Interface übereinstimmen.

Go hat die Hürde für den Einstieg in die Sprache in zweierlei Hinsicht sehr stark heruntergesetzt:

  1. Durch den Verzicht auf komplexe und idiosynchratische Konzepte
  2. Durch den Verzicht auf Tool Chains, für die man allein oft schon ein paar Tage investieren muss

Allerdings geht es nicht ganz ohne idiosynchratisches Gedöns, wenigstens, wenn es um Ordnerstrukturen und Umgebungsvariablen geht. Für ein kleines Projekt braucht man sich nicht darum zu scheren, aber wenn man den Code etwas mehr organisieren möchte, muss man sich schon ein bisschen einlesen.

Und dann sind da noch die GoRoutines und die dazugehörigen Channels, zwei Konzepte die in den letzten Jahren ganz erheblich an Bedeutung gewonnen haben. Für den Anfang würde ich sie aber noch beiseite lassen, da man sich erst daran gewöhnen muss, "concurrent" zu denken. Wer aber bereits in anderen Sprachen sicher mi Koroutinen umgeht, dürfte sich bei Go sehr gut aufgehoben fühlen.

Den Anfang macht man am besten auf der Projektseite https://golang.org/doc/. Gute und für Anfänger leicht nachvollziehbare Beispiele gibt es auf https://gobyexample.com/.