Go ist eine statisch typisierte, kompilierte Programmiersprache, die bei Google entstanden ist. Sie erzeugt ein einzelnes natives Binary, kompiliert in Sekunden, hat Garbage Collection und bringt Nebenläufigkeit über Goroutinen und Channels direkt in der Sprache mit. Ihr Hauptrevier ist serverseitige Software: APIs, Netzwerkdienste und die Kommandozeilen- und Cloud-Tools, die sie betreiben.
Hier ist ein vollständiges Go-Programm. Klick auf Run.
Jedes Go-Programm startet in package main bei func main(). := deklariert eine Variable und leitet ihren Typ ab (hier []string, ein Slice von Strings). range durchläuft den Slice und liefert dir einen Index und einen Wert. fmt und strings kommen aus der Standardbibliothek, die so groß ist, dass viele Programme nichts anderes importieren.
Go vs Golang: der Name
Die Sprache heißt Go. „Golang“ ist ein Spitzname von der ersten Website des Projekts, golang.org (die Seite liegt heute unter go.dev). Er blieb im Gebrauch, weil eine Websuche nach „go“ alles liefert außer der Sprache. Die offizielle Dokumentation sagt „Go“, aber „golang“ ist das Wort, das fast jeder ins Suchfeld tippt, und beide meinen dasselbe. Ein eigenes Produkt oder einen Dialekt namens „Golang“ gibt es nicht.
Wer Go entwickelt hat und warum
Robert Griesemer, Rob Pike und Ken Thompson haben 2007 bei Google begonnen, Go zu entwerfen. Im November 2009 wurde es als Open Source veröffentlicht, und Go 1.0 erschien im März 2012.
Die Motivation war praktisch. Die großen C++- und Java-Codebasen bei Google brauchten lange zum Bauen, Abhängigkeitsgraphen waren schwer zu verwalten, und Mehrkernrechner und vernetzte Dienste waren die Regel, aber nebenläufiger Code war fehleranfällig. Das Design von Go beantwortet diese Probleme direkt:
- Schnelle Builds. Imports sind explizit, ungenutzte Imports sind ein Compilerfehler, und der Compiler parst keine Header erneut, also bauen große Programme in Sekunden.
- Einfache Sprache. Wenige Schlüsselwörter, eine Schleife (
for), keine Vererbung, keine Exceptions. Code verschiedener Leute sieht tendenziell gleich aus, und das hilft bei Reviews in einem großen Team. - Nebenläufigkeit als Sprachfeature. Eine nebenläufige Aufgabe zu starten ist ein Schlüsselwort,
go, und über Channels kommunizieren Aufgaben miteinander. - Einfaches Deployment. Das Ergebnis ist ein Binary, das du auf einen Server kopierst. Es ist meist statisch gelinkt; mit aktiviertem cgo können Pakete wie
netgegen die C-Bibliothek des Systems linken, undCGO_ENABLED=0schaltet das ab.
Mit Go 1.0 kam außerdem das Kompatibilitätsversprechen von Go 1: Programme, die für Go 1.0 geschrieben wurden, kompilieren und laufen auch mit späteren 1.x-Releases. In der Praxis bricht ein Update der Toolchain deinen Code also selten, und das ist ein wichtiger Grund, warum Teams Go für langlebige Dienste vertrauen.
Wofür Golang verwendet wird
Go ist am stärksten dort, wo ein Programm übers Netzwerk kommuniziert, lange läuft und leicht auszuliefern sein muss:
| Bereich | Beispiele |
|---|---|
| Web-APIs und Microservices | HTTP- und gRPC-Dienste, Backends für Web- und Mobile-Apps |
| Cloud- und Infrastruktur-Tools | Docker, Kubernetes, Terraform, Prometheus |
| Kommandozeilentools | Entwickler-CLIs, die als ein Binary pro Plattform ausgeliefert werden |
| Netzwerk | Proxys, Load Balancer, DNS-Server |
| Datenpipelines | Worker, die Queues lesen, Datensätze umwandeln und in Datenbanken schreiben |
Weniger gut passt es zu Desktop-Apps mit GUI, mobilen Apps, Frontends im Browser und numerischer Arbeit oder Machine Learning, wo andere Ökosysteme viel bessere Bibliotheken haben.
Die wichtigsten Features, mit Code
Statische Typen mit Inferenz
Jede Variable hat einen Typ, der zur Compilezeit feststeht, aber du schreibst ihn selten aus. := leitet ihn ab:
Go konvertiert nie still zwischen Zahlentypen. count * price kompiliert nicht, weil der eine Wert ein int und der andere ein float64 ist; du schreibst float64(count) selbst. Das schließt stille Abschneide- und Genauigkeitsfehler aus.
Fehler sind Werte
Go hat keine Exceptions. Eine Funktion, die fehlschlagen kann, gibt als letztes Ergebnis einen error zurück, und der Aufrufer prüft ihn:
Das Muster if err != nil ist die bekannteste Zeile in Go-Code. Es ist wortreich, und genau das ist der Sinn: Jede Stelle, an der ein Programm fehlschlagen kann, ist dort sichtbar, wo es passiert. Wrapping und Untersuchung von Fehlern stehen auf der Seite zur Fehlerbehandlung.
Goroutinen und Channels
Eine Goroutine ist eine Funktion, die nebenläufig zum Rest des Programms läuft. Sie kostet ein paar Kilobyte Stack, also sind Tausende davon normal. Channels übergeben Werte sicher zwischen Goroutinen:
Die drei Goroutinen laufen nebenläufig, also können die drei Zeilen in beliebiger Reihenfolge erscheinen. Führ es ein paarmal aus, und du siehst womöglich verschiedene Reihenfolgen. main empfängt genau drei Werte und wartet daher auf alle, bevor es sich beendet.
Interfaces ohne „implements“
Ein Typ erfüllt ein Interface einfach dadurch, dass er die passenden Methoden hat. Ein Schlüsselwort implements gibt es nicht:
Rect und Circle erwähnen Shape nie, und trotzdem lassen sich beide in einem []Shape speichern. So kannst du ein Interface in dem Paket definieren, das es benutzt, lange nachdem die konkreten Typen geschrieben wurden.
Eine Toolchain
Der Befehl go erledigt alles: go run kompiliert und führt aus, go build erzeugt ein Binary, go test führt Tests aus, go fmt formatiert Code, go vet findet verdächtige Konstrukte, und go mod verwaltet Abhängigkeiten. Es gibt einen offiziellen Formatierungsstil, den gofmt durchsetzt, also streiten Go-Projekte nicht über Klammern oder Einrückung.
Was Go absichtlich weglässt
Manche Features, die in anderen Sprachen üblich sind, fehlen mit Absicht:
- Keine Klassen und keine Vererbung. Du nutzt Structs, Methoden, Interfaces und Embedding.
- Keine Exceptions. Fehler sind Rückgabewerte.
panicgibt es, aber für Bugs, nicht für gewöhnliche Fehlschläge. - Kein ternärer Operator. Du schreibst ein
if/else. - Kein Schlüsselwort
while.fordeckt jede Schleife ab. - Keine Funktionsüberladung und keine Standardargumente.
- Generics erst seit Go 1.18, und bewusst eingeschränkt im Vergleich zu C++-Templates oder Java-Generics.
Ehrliche Kompromisse
Wortreichtum. Explizite Fehlerprüfungen und fehlende Abkürzungen wie der ternäre Operator machen Go-Code länger als vergleichbaren Code in Python oder Kotlin. Lesen ist leicht; Schreiben braucht mehr Zeilen.
Garbage Collection. Der Collector von Go hat kurze Pausen, bleibt aber ein Garbage Collector. Für harte Echtzeitsysteme oder Code, bei dem jede Allokation zählt, geben dir C, C++ oder Rust mehr Kontrolle.
nil-Werte. Go hat nil-Pointer, -Maps, -Slices und -Interfaces. Eine Nil-Pointer-Dereferenzierung ist eine Panic zur Laufzeit, und der Compiler verhindert sie nicht so, wie es das Typsystem von Rust tut.
Ein kleines Typsystem. Keine Summentypen, keine Enums (du baust sie mit Konstanten und iota), und Generics, die die üblichen Fälle abdecken, aber keine fortgeschrittene Programmierung auf Typebene.
Lücken im Ökosystem. Bibliotheken für Webdienste, Datenbanken und Cloud-APIs sind hervorragend. Für GUIs, wissenschaftliches Rechnen und Machine Learning haben Python, C++ oder Julia weit mehr zu bieten.
Go im Vergleich mit anderen Sprachen
| Go | Python | Java | Rust | |
|---|---|---|---|---|
| Typisierung | Statisch | Dynamisch | Statisch | Statisch |
| Läuft als | Natives Binary | Interpreter | JVM-Bytecode | Natives Binary |
| Speicher | Garbage Collection | Garbage Collection | Garbage Collection | Ownership, kein GC |
| Nebenläufigkeit | Goroutinen, Channels | Threads, asyncio (GIL begrenzt CPU-Parallelität) | Threads, virtuelle Threads | Threads, async |
| Lernkurve | Flach | Flach | Mittel | Steil |
Nimm Go, wenn du kompilierte Performance und einfaches Deployment willst, ohne die Lernkurve von Rust oder die Zeremonie von Java.
Lohnt es sich, Go zu lernen?
Wenn du Backend-Dienste, Kommandozeilentools oder irgendetwas im Bereich Cloud-Infrastruktur schreibst, ja. Ein großer Teil dieses Ökosystems ist in Go geschrieben, und seinen Quellcode zu lesen gehört zum Job. Die Sprache ist klein, also hält sich der Aufwand in Grenzen: Die Kernsyntax dauert Tage, idiomatische Nebenläufigkeit und Fehlerbehandlung ein paar Wochen Übung.
Um lokal Go zu schreiben, installier Go und arbeite dann die Seite zu Hello World durch, die jede Zeile eines ersten Programms erklärt.
Häufig gestellte Fragen
Wofür wird Golang verwendet?
Vor allem für Backend- und Infrastruktursoftware: Webserver und APIs, Microservices, Kommandozeilentools, Netzwerkcode und Cloud-Tooling. Docker, Kubernetes, Terraform und Prometheus sind alle in Go geschrieben. Für Desktop-GUIs, mobile Apps oder Data Science wird es selten eingesetzt.
Ist Go dasselbe wie Golang?
Ja. Der Name der Sprache ist Go. „Golang“ stammt von der ursprünglichen Website-Adresse golang.org und hat sich gehalten, weil man nach „go“ schlecht suchen kann. Beide Namen bezeichnen dieselbe Sprache und dieselbe Toolchain.
Wer hat die Programmiersprache Go entwickelt?
Robert Griesemer, Rob Pike und Ken Thompson haben Go ab 2007 bei Google entworfen. Im November 2009 wurde Go als Open Source angekündigt, und Go 1.0, die Release, mit der das Kompatibilitätsversprechen von Go begann, erschien im März 2012.
Ist Go leicht zu lernen?
Die Sprache selbst ist klein: 25 Schlüsselwörter, ein einziges Schleifenkonstrukt und eine kurze Spezifikation, die du an einem Nachmittag lesen kannst. Die meisten Programmierer mit Erfahrung in einer anderen Sprache schreiben innerhalb weniger Tage funktionierendes Go. Länger dauern die Idiome: explizite Fehlerbehandlung, Interfaces und korrekter nebenläufiger Code mit Goroutinen und Channels.
Wird Go kompiliert oder interpretiert?
Kompiliert. go build erzeugt ein natives Binary aus Maschinencode, das von keinem Interpreter und keiner virtuellen Maschine abhängt. Auch go run kompiliert; es baut nur an einen temporären Ort und führt das Ergebnis aus.