EMZETT.
Login

Go

Kurz: Eine von Google entwickelte, kompilierte Programmiersprache — bewusst einfach gehalten, mit eingebauter Unterstützung für Nebenläufigkeit (Goroutines) und sehr schnellen Kompilierzeiten.

Genauer: Go verzichtet absichtlich auf viele Features anderer moderner Sprachen (z. B. Vererbung, Exceptions im klassischen Sinn), um Code einfach lesbar und wartbar zu halten. Sehr beliebt für Backend-Services, Cloud-Infrastruktur-Tools (Docker und Kubernetes sind in Go geschrieben) und Command-Line-Tools.

Im Detail

func main() {
    ch := make(chan string)
    go sayHello(ch)
    fmt.Println(<-ch)
}

Goroutinen (das go-Schlüsselwort im Beispiel) sind Gos Antwort auf Nebenläufigkeit: extrem leichtgewichtige, vom Go-Laufzeitsystem verwaltete “Mini-Threads”, von denen problemlos Zehntausende gleichzeitig laufen können, ohne das Betriebssystem mit echten Betriebssystem-Threads zu überlasten. Channels (chan) sind das dazugehörige Kommunikationsmittel zwischen Goroutinen — statt sich gemeinsamen Speicher mit Locks zu teilen (die klassische, fehleranfällige Herangehensweise), schicken Goroutinen sich Daten explizit über Channels zu.

Statt Exceptions gibt Go Fehler als ganz normalen zweiten Rückgabewert einer Funktion zurück, den der Aufrufer explizit prüfen muss — wirkt auf Einsteiger ungewohnt umständlich, macht Fehlerbehandlung aber an jeder Stelle im Code sichtbar statt implizit über eine Exception-Kette. Go kompiliert zu einer einzigen, abhängigkeitsfreien ausführbaren Datei, was Deployment stark vereinfacht — einer der Gründe, warum so viel Cloud-Infrastruktur-Software (Docker, Kubernetes, Terraform) in Go geschrieben ist.

Entstehung bei Google

Go wurde 2007 von Robert Griesemer, Rob Pike und Ken Thompson bei Google entwickelt (öffentlich vorgestellt 2009) — alle drei mit tiefen Wurzeln in der Unix- und Systemprogrammiergeschichte (Thompson war Mitentwickler von Unix selbst). Der Auslöser war Frustration über lange Kompilierzeiten bei C++ in Googles riesigen Codebasen und das Fehlen einer modernen Sprache, die nebenläufige Programmierung von Grund auf einfach macht — beide Ziele prägen Go bis heute: Kompilierzeiten liegen typischerweise im Sekundenbereich selbst für große Projekte, und Nebenläufigkeit ist über Goroutinen ein Sprachfeature erster Klasse statt eine nachträglich hinzugefügte Bibliothek.

Bewusster Verzicht auf Features

Ungewöhnlich für eine moderne Sprache ist Gos bewusste Sparsamkeit: Es gibt keine klassische Vererbung (stattdessen Komposition über Interfaces), keine Generics in den ersten zehn Jahren der Sprache (erst 2022 mit Go 1.18 nachgerüstet), keine Ausnahmebehandlung im klassischen Sinn, keine Ternary-Operatoren. Diese Zurückhaltung ist explizite Designphilosophie: Die Sprachdesigner wollten verhindern, dass sich unterschiedliche Teams innerhalb eines großen Unternehmens völlig unterschiedliche Idiome und Stile aneignen — Go-Code verschiedener Autoren soll sich möglichst ähnlich lesen. Das eingebaute Formatierungswerkzeug gofmt verstärkt das zusätzlich, indem es einen einzigen, nicht konfigurierbaren Formatierungsstil für die gesamte Sprache durchsetzt.

Typisches Einsatzgebiet: Cloud-native Infrastruktur

Gos Kombination aus schneller Kompilierung, geringem Speicherverbrauch pro Goroutine und einfachem Deployment (eine einzelne Binärdatei ohne Laufzeitabhängigkeiten) macht die Sprache besonders attraktiv für Cloud-Infrastruktur-Software, die selbst in großer Zahl parallel laufen und schnell starten muss. Neben Docker und Kubernetes sind auch Werkzeuge wie Terraform, Prometheus und etcd in Go geschrieben — die Sprache hat sich damit faktisch zur Standardsprache des “Cloud Native”-Ökosystems entwickelt, das von der Cloud Native Computing Foundation koordiniert wird.

Siehe auch: Rust, Docker, Nebenläufigkeit