Ein Einstieg in die Programmiersprache Go, Teil 2

Seite 4: Go in der Praxis

Inhaltsverzeichnis

Die Autoren konnten in den letzten Jahren reichlich Erfahrungen mit Go im professionellen Umfeld sammeln. Trotz – oder zum Teil gerade wegen – fehlender Spracheigenschaften, die zeitgemäße Sprachen wie Scala oder Rust mitbringen, ist Go heute häufig die Sprache der Wahl, um Probleme effizient zu lösen.

Durch die Schlichtheit der Sprache ist es nicht möglich, Probleme so elegant und ausdrucksstark wie in anderen Sprachen zu beseitigen. Stattdessen erinnert der Code Neueinsteiger eher an Spaghetticode. Vor allem die fehlende Fehlerbehandlung und die daraus resultierenden if err == nil-Blöcke wirken, vor allem am Anfang, abschreckend. Bei unbekanntem Code kann das jedoch ein großer Vorteil sein, da Go-Code in der Regel einfach nachvollziehbar ist.

Trotz des beschränkten Umfangs der Sprache gibt es eine Sammlung von Best-Practice-Regeln, die allgemein in der Community anerkannt sind. Dieses "Idiomatic Go" prägten maßgeblich die Go-Autoren, und es ist anfangs zum Teil gewöhnungsbedürftig, da sie beispielsweise Map- und Filter-Funktionen als unnütz betrachten. Teil von Idiomatic Go ist auch das Formatierprogramm gofmt, das ein Quasi-Standard bei Go-Programmierern ist und den Code einheitlich formatiert. Diskussionen, ob die geschweifte Klammer in dieselbe oder in die nächste Zeil gehört, oder ob man mit Tabs oder Leerzeichen einrückt (bei Go sind es übrigens Tabs), braucht man somit nicht zu führen.

Die Kombination einer unkomplizierten Sprache mit einer umfangreichen Standardbibliothek erlaubt es, Applikationen oftmals ohne weitere Drittanbieter-Bibliotheken zu erstellen. Werden Bibliotheken eingesetzt, handelt es sich oft nur um API-Wrapper, die REST-Calls abstrahieren (zum Beispiel gegen die API von Kubernetes oder AWS). Bei der Standardbibliothek fällt auf, dass erfahrene Programmierer beteiligt waren, die Probleme pragmatisch lösen möchten.

Der häufige Einsatz von Go in Infrastrukturprojekten hat mehrere gute Gründe. Zunächst sind Nebenläufigkeiten einfach durch Channels und Go-Routinen umsetzbar. Außerdem enthält die Standardbibliothek häufige Abhängigkeiten wie HTTP-Client, HTTP-Server oder JSON En- und Decoding. Da Go die Programme statisch kompiliert, reicht es, das Ergebnis einfach auf den Zielrechner zu kopieren. Installationen von Abhängigkeiten wie dynamische Bibliotheken, Gems oder einer Java-VM, um ein Programm starten zu können, entfallen. Entwickler können statisch kompilierte Go-Programme außerdem einfach als Docker-Images verpacken: Da man keine dynamischen Bibliotheken benötigt, besteht das Docker-Image nur aus dem Go-Binary.

Die Ressourcenanforderungen von Go-Programmen sind gering. In Systemen wie Kubernetes eignen sich Go-Programme daher hervorragend für kleine Sidecar-Umsetzungen, um beispielsweise eine Autorisierung zu implementieren, die mehrere Apps nutzen können.

In Projekten, bei denen Wahlfreiheit bezüglich Programmiersprachen bestand, haben die Autoren die Beobachtung gemacht, dass Go-Neulinge nicht müde werden, sich über die sprachlichen Unzulänglichkeiten zu beschweren, das nächste Projekt dann aber trotz allem in Go statt Scala oder Haskell zu implementieren, da es "für das vorliegende Problem gerade gut passt".