Wofür ist die Go-Sprache wirklich gut?

In den mehr als neun Jahren in freier Wildbahn hat sich Googles Go-Sprache, auch bekannt als Golang, mit Version 1.13 ab September 2019, von einer Neugier für Alpha-Geeks zu einer kampferprobten Programmiersprache hinter einigen der wichtigsten der Welt entwickelt Cloud-zentrierte Projekte. 

Warum wurde Go von den Entwicklern von Projekten wie Docker und Kubernetes ausgewählt? Was zeichnet Go aus, wie unterscheidet es sich von anderen Programmiersprachen und welche Arten von Projekten eignen sich am besten zum Erstellen? In diesem Artikel werden wir den Funktionsumfang von Go, die optimalen Anwendungsfälle, die Auslassungen und Einschränkungen der Sprache sowie den Weg von Go von hier aus untersuchen.

Go Sprache ist klein und einfach

Go oder Golang, wie es oft genannt wird, wurde von Google-Mitarbeitern entwickelt - hauptsächlich von dem langjährigen Unix-Guru und dem angesehenen Google-Ingenieur Rob Pike -, aber es handelt sich nicht streng genommen um ein „Google-Projekt“. Go wird vielmehr als von der Community geführtes Open-Source-Projekt entwickelt, das von Führungskräften geleitet wird, die eine starke Meinung darüber haben, wie Go verwendet werden soll und in welche Richtung die Sprache gehen soll.

Go soll einfach zu erlernen, einfach zu handhaben und für andere Entwickler leicht zu lesen sein. Go verfügt nicht über einen großen Funktionsumfang, insbesondere im Vergleich zu Sprachen wie C ++. Go erinnert in seiner Syntax an C, was es für langjährige C-Entwickler relativ einfach macht, es zu lernen. Viele Funktionen von Go, insbesondere die Funktionen für Parallelität und funktionale Programmierung, gehen jedoch auf Sprachen wie Erlang zurück.

Als C-ähnliche Sprache zum Erstellen und Verwalten plattformübergreifender Unternehmensanwendungen aller Art hat Go viel mit Java gemeinsam. Um eine schnelle Entwicklung von Code zu ermöglichen, der möglicherweise überall ausgeführt wird, können Sie eine Parallele zwischen Go und Python ziehen, obwohl die Unterschiede weitaus größer sind als die Ähnlichkeiten.

Go Sprache hat für jeden etwas zu bieten

In der Go-Dokumentation wird Go als „schnelle, statisch typisierte, kompilierte Sprache, die sich wie eine dynamisch typisierte, interpretierte Sprache anfühlt“ beschrieben. Selbst ein großes Go-Programm wird in Sekundenschnelle kompiliert. Außerdem vermeidet Go einen Großteil des Overheads von C-Style-Include-Dateien und -Bibliotheken.

Go erleichtert dem Entwickler das Leben auf verschiedene Weise:

  • Bequemlichkeit.  Go wurde mit Skriptsprachen wie Python verglichen, da es viele gängige Programmieranforderungen erfüllen kann. Einige dieser Funktionen sind in die Sprache selbst integriert, z. B. „Goroutinen“ für Parallelität und threadähnliches Verhalten, während zusätzliche Funktionen in Go-Standardbibliothekspaketen wie dem http-Paket von Go verfügbar sind. Wie Python bietet Go automatische Speicherverwaltungsfunktionen, einschließlich Garbage Collection.

    Im Gegensatz zu Skriptsprachen wie Python wird Go-Code zu einer schnell laufenden nativen Binärdatei kompiliert. Und im Gegensatz zu C oder C ++ wird Go extrem schnell kompiliert - schnell genug, damit sich die Arbeit mit Go eher nach einer Skriptsprache als nach einer kompilierten Sprache anfühlt. Darüber hinaus ist das Go-Build-System weniger komplex als das anderer kompilierter Sprachen. Das Erstellen und Ausführen eines Go-Projekts erfordert nur wenige Schritte und wenig Buchhaltung.

  • Geschwindigkeit.  Go-Binärdateien laufen langsamer als ihre C-Gegenstücke, aber der Geschwindigkeitsunterschied ist für die meisten Anwendungen vernachlässigbar. Die Go-Leistung ist für die überwiegende Mehrheit der Arbeit so gut wie C und im Allgemeinen viel schneller als andere Sprachen, die für ihre Entwicklungsgeschwindigkeit bekannt sind (z. B. JavaScript, Python und Ruby).
  • Portabilität.  Mit der Go-Toolchain erstellte ausführbare Dateien können ohne externe Standardabhängigkeiten eigenständig sein. Die Go-Toolchain ist für eine Vielzahl von Betriebssystemen und Hardwareplattformen verfügbar und kann zum plattformübergreifenden Kompilieren von Binärdateien verwendet werden.
  • Interoperabilität.  Go bietet all das, ohne den Zugriff auf das zugrunde liegende System zu beeinträchtigen. Go-Programme können mit externen C-Bibliotheken kommunizieren oder native Systemaufrufe ausführen. In Docker beispielsweise funktioniert Go mit Linux-Funktionen, cgroups und Namespaces auf niedriger Ebene, um Container-Magie zu erzeugen.
  • Unterstützung.  Die Go-Toolchain ist als Linux-, MacOS- oder Windows-Binärdatei oder als Docker-Container frei verfügbar. Go ist standardmäßig in vielen gängigen Linux-Distributionen wie Red Hat Enterprise Linux und Fedora enthalten, wodurch die Bereitstellung von Go-Quellen auf diesen Plattformen etwas einfacher wird. Die Unterstützung für Go ist auch in vielen Entwicklungsumgebungen von Drittanbietern stark, von Microsoft Visual Studio Code bis zur Komodo-IDE von ActiveState.

Where Go-Sprache funktioniert am besten

Keine Sprache ist für jeden Job geeignet, aber einige Sprachen eignen sich für mehr Jobs als andere.

Go scheint am hellsten für die Entwicklung der folgenden Anwendungstypen:

  • Verteilte Netzwerkdienste. Netzwerkanwendungen leben und sterben durch Parallelität, und die nativen Parallelitätsfunktionen von Go - hauptsächlich Goroutinen und Kanäle - eignen sich gut für solche Arbeiten. Folglich sind viele Go-Projekte für Netzwerke, verteilte Funktionen und Cloud-Dienste vorgesehen: APIs, Webserver, minimale Frameworks für Webanwendungen und dergleichen.
  • Cloud-native Entwicklung. Dank der Parallelitäts- und Netzwerkfunktionen von Go und seiner hohen Portabilität eignet sich Go gut zum Erstellen von Cloud-nativen Apps. Tatsächlich wurde Go verwendet, um mehrere Eckpfeiler des Cloud-nativen Computing zu erstellen, darunter Docker, Kubernetes und Istio.
  • Ersatz für vorhandene Infrastruktur. Ein Großteil der Software, auf die wir für die Internetinfrastruktur angewiesen sind, altert und wird von Exploits durchdrungen. Das Umschreiben solcher Dinge in Go bietet viele Vorteile - bessere Speichersicherheit, einfachere plattformübergreifende Bereitstellung und eine saubere Codebasis, um die zukünftige Wartung zu fördern. Ein neuer SSH-Server namens Teleport und eine neue Version des Network Time Protocol werden in Go geschrieben und als Ersatz für ihre herkömmlichen Gegenstücke angeboten.
  • Dienstprogramme und eigenständige Tools. Go-Programme werden in Binärdateien mit minimalen externen Abhängigkeiten kompiliert. Dies macht sie ideal für die Erstellung von Dienstprogrammen und anderen Werkzeugen geeignet, da sie schnell gestartet werden und problemlos zur Weiterverteilung verpackt werden können.

Gehen Sie Sprachbeschränkungen

Go's meinungsgebundenes Feature-Feature hat sowohl Lob als auch Kritik hervorgerufen. Go wurde entwickelt, um klein und leicht verständlich zu sein, wobei bestimmte Funktionen absichtlich weggelassen wurden. Das Ergebnis ist, dass einige Funktionen, die in anderen Sprachen üblich sind, absichtlich nicht in Go verfügbar sind.

Eine solche Funktion sind Generika, mit denen eine Funktion viele verschiedene Arten von Variablen akzeptieren kann. Go enthält keine Generika, und die Verwalter der Sprache sind dagegen, sie hinzuzufügen, da Generika die Einfachheit der Sprache beeinträchtigen würden. Es ist möglich, diese Einschränkung zu umgehen, aber viele Entwickler jucken immer noch, wenn Generika auf irgendeine Weise zu Go hinzugefügt werden. Mindestens ein Vorschlag zur Implementierung von Generika in Go wurde vorgelegt, aber nichts wurde in Stein gemeißelt.

Ein weiterer Nachteil von Go ist die Größe der generierten Binärdateien. Go-Binärdateien werden standardmäßig statisch kompiliert, was bedeutet, dass alles, was zur Laufzeit benötigt wird, im Binärbild enthalten ist. Dieser Ansatz vereinfacht den Erstellungs- und Bereitstellungsprozess, jedoch auf Kosten einer einfachen „Hallo Welt!“ unter 64-Bit-Windows mit einem Gewicht von ca. 1,5 MB. Das Go-Team hat daran gearbeitet, die Größe dieser Binärdateien mit jeder weiteren Version zu reduzieren. Es ist auch möglich, Go-Binärdateien durch Komprimierung oder durch Entfernen der Debug-Informationen von Go zu verkleinern. Diese letzte Option funktioniert möglicherweise besser für eigenständige verteilte Apps als für Cloud- oder Netzwerkdienste, bei denen Debug-Informationen hilfreich sind, wenn ein Dienst fehlschlägt.

Eine weitere angepriesene Funktion von Go, die automatische Speicherverwaltung, kann als Nachteil angesehen werden, da die Speicherbereinigung einen gewissen Verarbeitungsaufwand erfordert. Go bietet keine manuelle Speicherverwaltung, und die Speicherbereinigung in Go wurde dafür kritisiert, dass sie mit den Arten von Speicherlasten, die in Unternehmensanwendungen auftreten, nicht gut umgehen kann. Auf der positiven Seite bringt Go 1.8 viele Verbesserungen bei der Speicherverwaltung und der Speicherbereinigung, die die Verzögerungszeit reduzieren. Natürlich haben Go-Entwickler die Möglichkeit, die manuelle Speicherzuweisung in einer C-Erweiterung oder über eine manuelle Speicherverwaltungsbibliothek eines Drittanbieters zu verwenden.

Die Kultur der Software zum Erstellen umfangreicher GUIs für Go-Anwendungen, z. B. in Desktop-Anwendungen, ist immer noch verstreut.

Die meisten Go-Anwendungen sind Befehlszeilentools oder Netzwerkdienste. Verschiedene Projekte arbeiten jedoch daran, umfangreiche GUIs für Go-Anwendungen bereitzustellen. Es gibt Bindungen für die GTK- und GTK3-Frameworks. Ein anderes Projekt soll plattformeigene Benutzeroberflächen bereitstellen, obwohl diese auf C-Bindungen basieren und nicht in reinem Go geschrieben sind. Und Windows-Benutzer können Walk ausprobieren. In diesem Bereich hat sich jedoch kein klarer Gewinner oder keine sichere langfristige Wette herauskristallisiert, und einige Projekte, wie beispielsweise der Versuch von Google, eine plattformübergreifende GUI-Bibliothek aufzubauen, sind auf der Strecke geblieben. Da Go vom Design her plattformunabhängig ist, ist es unwahrscheinlich, dass eines dieser Elemente Teil des Standardpakets wird.

Obwohl Go mit nativen Systemfunktionen kommunizieren kann, wurde es nicht für die Erstellung von Systemkomponenten auf niedriger Ebene wie Kerneln oder Gerätetreibern oder eingebetteten Systemen entwickelt. Schließlich hängen die Go-Laufzeit und der Garbage Collector für Go-Anwendungen vom zugrunde liegenden Betriebssystem ab. (Entwickler, die an einer hochmodernen Sprache für diese Art von Arbeit interessiert sind, könnten sich mit der Rust-Sprache befassen.)

Gehen Sie Sprachzukünfte

Die nächste Phase in der Go-Entwicklung wird möglicherweise mehr von den Wünschen und Bedürfnissen der Entwicklerbasis bestimmt, da die Köpfe von Go die Sprache ändern, um diesem Publikum besser gerecht zu werden, anstatt nur mit hartnäckigen Beispielen zu führen. Mit anderen Worten, Go erhält möglicherweise die Funktionen, die ursprünglich nicht dafür vorgesehen waren, wie z. B. Generika.

Es ist klar, dass Golang-Entwickler diese Dinge wollen. Bei der Go-Benutzerumfrage 2018 wurden Generika unter den drei größten Herausforderungen im Hinblick auf eine breitere Go-Einführung sowie eine bessere Abhängigkeit und Paketverwaltung platziert. Ein bestehender Vorschlag für GitHub für Generika bleibt als Vorschlag für Go 2.x aktiv. Änderungen wie diese können dazu beitragen, dass Go einen zentraleren Platz in der Unternehmensentwicklung einnimmt, in der Java, JavaScript und Python derzeit an oberster Stelle stehen.

Auch ohne größere Änderungen können wir eine verstärkte Verwendung von Go für Projekte zum Wiederaufbau der Infrastruktur erwarten, wie oben beschrieben als Ersatz für SSH und NTP und als Teil mehrsprachiger Projekte. 

Implementierungen der Go-Toolchain durch Dritte haben ebenfalls zugenommen. ActiveGo von ActiveState bietet eine kommerziell unterstützte Version der Go-Sprache, und sowohl das LLVM- als auch das gccgo-Projekt bieten frei lizenzierte Open Source-Implementierungen von Go über alternative Toolchains.

Schließlich diente Go auch als Basis für die Entwicklung völlig neuer Sprachen, obwohl zwei Beispiele dafür die aktive Entwicklung eingestellt haben. Ein Beispiel war die Have-Sprache, die die Go-Syntax optimierte, einige der gleichen Konzepte auf ihre eigene Weise implementierte und zur einfachen Ausführung in Go transpilierte. Ein anderes nicht mehr existierendes Projekt, Oden, verwendete Go's Assembler und Toolchain, um eine neu gestaltete Sprache zu kompilieren, die sich zusätzlich von Sprachen wie Lisp und Haskell inspirieren ließ.

Diese letzte Reihe von Projekten zeigt, wie jede IT-Innovation wirklich revolutionär wird - wenn Menschen sie auseinander nehmen und wiederverwenden, finden sie Verwendungszwecke, die ihre Designer nie beabsichtigt haben. Die Zukunft der Go-Sprache als hackbares Projekt steht erst am Anfang. Die Zukunft als wichtige Programmiersprache ist jedoch bereits gesichert, sicherlich in der Cloud, wo die Geschwindigkeit und Einfachheit von Go die Entwicklung einer skalierbaren Infrastruktur erleichtert, die langfristig beibehalten werden kann.