Einleitung

Kubernetes und Containerisierung sind in aller Munde. Obwohl Container keine neue Erscheinung sind, befinden sich viele Sprachen noch im Prozess zur Containerfähigkeit. Go hingegen ist in einer Welt mit Containern aufgewachsen.

Ich möchte in diesem Beitrag erläutern, was genau Go anders und bezüglich der Containerunterstützung besser macht. Dabei werde ich die Sprache in erster Hinsicht konzeptionell betrachten und nicht auf Codebeispiele zurückgreifen.

Kurzbeschreibung

Go ist eine statisch typisierte Programmiersprache, die von Google Mitarbeitern entwickelt wurde. Die Gründungsväter von Go sind Robert Griesemer, Rob Pike und Ken Thompson. Als Grund für die Entwicklung wird häufig die Unzufriedenheit mit anderen Programmiersprachen (Java, C++) für verteilte Systeme und Cloud-Computing genannt. Diese Aussage vertritt auch Rob Pike in dem Kurzinterview „Why Learn Go“, zu finden auf Youtube.

In unserem Kundenkreis sehen wir aber, dass auch kleinere Unternehmen sich heutzutage mit ähnlichen Herausforderungen konfrontiert sehen, wie die „Big Five“ vor einigen Jahren.

Key Features

Multi-Plattform und Kompilierung

Go unterstützt mehrere Plattformen (Linux, Windows, MacOS) und lässt sich für die gewählte Umgebung in ein Binary Executable kompilieren. Es ist also keine separate Runtime nötig um ein kompiliertes Programm auszuführen.

Dadurch kann ein Container-Image sehr klein gehalten werden. Das verringert die Wartezeiten bei Skalierungen und Containerstart und macht Go für den Einsatz in der Containerwelt besonders attraktiv.

Bei der Entwicklung von Go wurde zudem großer Wert auf kurze Übersetzungszeiten gelegt. Das Kompilieren eines Go-Programms dauert (abhängig vom Umfang der Anwendung) zwischen wenigen Millisekunden und ein paar Sekunden.

Garbage Collection

Die Programmiersprache verfügt – ähnlich wie Java – über eine automatische Speicherbereinigung. Entwickler müssen nicht darauf achten, den angeforderten Speicher auch wieder freizugegeben. Meiner Ansicht nach bietet dies einen höheren Programmierkomfort. Außerdem kann der Fokus bei der Programmierung vorrangig auf dem eigentlichen Business-Case liegen.

Nebenläufigkeit

Eines der Design-Ziele von Go ist es, Code ohne viel Aufwand nebenläufig ausführen zu können. Dafür wird auf das Konzept sogenannter Go-Routinen (Goroutines) zurückgegriffen. Prinzipiell kann jede Funktion nebenläufig zum Rest des Codes ausgeführt werden, in dem sie mit dem Keyword go aufgerufen wird. Die integrierte Go-Runtime verteilt die Go-Routinen danach automatisch auf mehrere Prozessorkerne (sofern verfügbar). Im besten Fall wird der Code also nicht nur nebenläufig, sondern sogar parallel ausgeführt.

Alleine über das Thema „Nebenläufigkeit“ könnte man mindestens einen eigenen Artikel verfassen. Da ich hier aber nur einen Überblick geben möchte verzichte an dieser Stelle auf weitere Erklärungen.

Need to Know

Dependency Management

Wo sich für andere Sprachen Standards wie Maven oder NPM etabliert haben, war bei Go lange Zeit eine große Lücke, bis einige Community-Projekte versuchten diese zu schließen. Wahrscheinlich hat nicht zuletzt dieses Vakuum viele Interessierte davon abgehalten sich näher mit der Sprache zu beschäftigen.

Seit Version 1.11 bringt Go nun endlich eine eigene, integrierte Lösung mit: Go-Modules. Code-Pakete leben in sogenannten Modulen. Wenn ein Paket genutzt werden soll wird dieses entweder über die Kommandozeile oder per Hand in eine Datei eingepflegt. Vor dem Kompiliervorgang wird diese Datei ausgewertet und fehlende Abhängigkeiten nachgeladen.

Go-Modules prägen sehr stark den Open-Source Gedanken, denn sie leben meistens in öffentlichen zugänglichen Git-Repositories.

Objektorientierung

Auch bei der Objektorientierung macht Go ein paar Dinge anders. Im Gegensatz zu vielen anderen Programmiersprachen werden Objekte nicht durch Klassen beschrieben, sondern durch Strukturen (structs). Es wird auf klassische Vererbung verzichtet. Stattdessen kann ein vorher definierter Typ einer anonymen Variable innerhalb einer Struktur leben.

Polymorphie geschieht implizit. Die gewünschten Funktionen werden in einem Interface beschrieben. Wenn ein Typ alle Methoden eines Interfaces implementiert, gilt das Interface als implementiert.

Innerhalb der Struktur kann ein anderer Typ über eine anonyme Variable implementiert werden. Anschließend können die Methoden des implementierten Typs auch auf dem implementierenden Typ ausgeführt werden.

Diese so geerbten Methoden können außerdem noch überschrieben werden.

Vorgegebene Struktur

In Go werden viele Probleme oder Unstimmigkeiten unterschiedlicher Programmierstile direkt verhindert. Die Syntax von Go fordert eine einheitliche Formatierung. Ungenutzte Variablen und Imports führen zu Kompilierfehlern. Eine Klammer in einer neuen Zeile geöffnet? Kompilierfehler!

Das Standard-Toolset umfasst aber einen sehr guten Linter, der viele Formatierungsregeln direkt anwenden kann.

Automatische Typenzuweisung

Go bietet dem Entwickler eine automatische Typenzuweisung zur Kompilierzeit. Variablen die mit dem Operator := anstelle von = zugewiesen werden, benötigen keine explizite Definition des gewünschten Datentyps. Stattdessen wird automatisch der Typ des zugewiesenen Wertes übernommen.

Error-Handling und mehrere Rückgabewerte

Eine Funktion kann in Go mehrere Werte zurückgeben. Das wird häufig für das Behandeln von Fehlern genutzt. Konnte eine Funktion die gewünschte Aufgabe nicht beenden wird als letzter Rückgabewert oft ein Error-Objekt mitgegeben. Sollte ein Error-Objekt zurückgegeben werden enthält es auch gleich die entsprechende Fehlermeldung.

Go statistisch betrachtet

Auch wenn Go im Vergleich zu bspw. Java oder C++ noch ziemlich neu ist (die erste stabile Version erschien 2012), findet sich die Sprache jedoch bereits in einigen Statistiken wieder. Darunter ist eine Umfrage von Stack Overflow, einem Internetportal für Fragen rund um Softwareentwicklung. Die Benutzer wurden hinsichtlich ihrer genutzten Programmiersprachen befragt.

Aus der Umfrage geht hervor, dass ca. 16% aller Befragten noch nicht mit Go gearbeitet haben, sich die Sprache aber in Zukunft anschauen möchten. Go belegt in diesem Ranking Platz drei. Damit liegt die Sprache knapp vor TypeScript (11,9% und Rang fünf) und deutlich vor Rust (8,3% und Rang acht).

Stack Overflow Developer Survey Results 2018,https://insights.stackoverflow.com/survey/2018/#most-loved-dreaded-and-wanted

Eine Andere Statistik zeigt die monatlichen Benutzer von Programmiersprachen auf Github über die letzten Jahre. Etwa 4% der monatlichen Github-Benutzer arbeiten an Projekten mit der Programmiersprache Go. Zum Vergleich: Javascript belegt mit ca. 22% im Gesamtranking den ersten Platz, gefolgt von Python (ca. 14,8%) und Java (ca. 14%).

Monatlich aktive Benutzer (MAU) auf Github mit dem Fokus auf sich entwickelnde Programmiersprachen, https://www.benfrederickson.com/ranking-programming-languages-by-github-users/

Wer zudem einen Blick auf die Projekte der Cloud Native Computing Foundation (CNCF) wirft, wird feststellen, dass viele der Projekte ebenfalls in Go geschrieben sind. Der prominenteste Vertreter aus dem Portfolio der CNCF ist sicherlich Kubernetes. Aber es findet sich dort auch die Graphdatenbank Prometheus.

Fazit

Go ist für die neue Container-Welt gemacht worden. Anwendungen leben heute nicht mehr in schwergewichtigen VM’s sondern in kleinen Containern. Nicht zuletzt deshalb erleben Binary Executables gerade eine Renaissance.

Zudem adressiert Go ziemlich exakt eine Domäne: Backend-Entwicklung. Das zeigt sich darin, dass es für quasi jede Datenbank einen Treiber in Go (oder einen Go-Wrapper um den C-Treiber) gibt. Auch ist oder wird der Stack, welcher jahrelang um anderen Sprachen herum aufgebaut wurde, bereits in Go übertragen. Als Beispiel möchte ich hier NATS.io von der CNCF erwähnen, welches als alternativer Streaming-Server zu Apache Kafka eingesetzt werden kann.

Dass Go sich in diesem Okösystem heimisch fühlt, habe ich während der Entwicklung sehr stark gemerkt. Auch wenn nicht alles wie gewohnt funktionierte, habe ich sehr schnell einen Einstieg in die Konzepte der Sprache gefunden. 

Zusammengefasst: Es macht mir einfach Spaß, mit Go zu entwickeln.

Jetzt teilen auf:

2 Comments

  1. Jennifer Joseph 7. September 2019 at 16:03 - Reply

    Interessanter Beitrag

  2. Jennfer Joseph 7. September 2019 at 16:15 - Reply

    Sehr informativ

Jetzt kommentieren