Go Spickzettel
Zuletzt aktualisiert
Hello World & Programmaufbau
Jedes Go-Programm liegt in einem Package; der Einstiegspunkt ist func main im Package main.
| Operation | Syntax |
|---|---|
| Package-Deklaration | package main |
| Ein Package importieren | import "fmt" |
| Mehrere Packages importieren | import (\n "fmt"\n "os"\n) |
| Einstiegspunkt | func main() { ... } |
| Eine Zeile ausgeben | fmt.Println("Hello, World!") |
| Formatierte Ausgabe | fmt.Printf("%d items\n", n) |
| Eine Datei ausführen | go run main.go |
| Eine Binärdatei bauen | go build |
Variablen & Typen
Go ist statisch typisiert, kann Typen aber mit := ableiten.
| Operation | Syntax |
|---|---|
| Mit Typ deklarieren | var age int = 30 |
| Mit Inferenz deklarieren | var name = "Ada" |
| Kurze Deklaration | count := 0 |
| Mehrere auf einmal | x, y := 1, 2 |
| Konstante | const Pi = 3.14 |
| Nullwerte | 0, "", false, nil |
| Basistypen | int, float64, string, bool, byte, rune |
| Typumwandlung | f := float64(i) |
Kontrollfluss
Go hat ein einziges Schleifen-Schlüsselwort - for - und keine Klammern um Bedingungen.
| Operation | Syntax |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| If mit Init-Anweisung | if v, ok := m[k]; ok { ... } |
| For-Schleife (C-Stil) | for i := 0; i < 10; i++ { ... } |
| While-artige Schleife | for x < 100 { ... } |
| Endlosschleife | for { ... } |
| Range über ein Slice | for i, v := range items { ... } |
| Switch | switch day { case 1: ...; default: ... } |
| Switch ohne Ausdruck | switch { case x > 0: ... } |
| Break / continue | break, continue |
Funktionen
Funktionen sind Werte erster Klasse und können mehrere Ergebnisse zurückgeben.
| Operation | Syntax |
|---|---|
| Einfache Funktion | func add(a int, b int) int { return a + b } |
| Gemeinsamer Parametertyp | func add(a, b int) int { ... } |
| Mehrere Rückgabewerte | func divmod(a, b int) (int, int) { return a / b, a % b } |
| Benannte Rückgabewerte | func split(sum int) (x, y int) { x = sum / 2; return } |
| Variadische Funktion | func sum(nums ...int) int { ... } |
| Anonyme Funktion | f := func() { ... } |
| Closure | func counter() func() int { ... } |
| Defer (läuft beim Return) | defer file.Close() |
Slices & Arrays
Arrays haben eine feste Größe; Slices sind dynamische Sichten auf Arrays.
| Operation | Syntax |
|---|---|
| Array fester Größe | var a [3]int |
| Slice-Literal | nums := []int{1, 2, 3} |
| Ein Slice erstellen | s := make([]int, 0, 10) |
| Anhängen | s = append(s, 4) |
| Länge / Kapazität | len(s), cap(s) |
| Ein Slice teilen | s[1:3] |
| Kopieren | copy(dst, src) |
| Durchlaufen | for i, v := range s { ... } |
Maps
Maps sind die eingebauten Hashtabellen von Go.
| Operation | Syntax |
|---|---|
| Eine Map erstellen | m := make(map[string]int) |
| Map-Literal | m := map[string]int{"a": 1, "b": 2} |
| Einen Wert setzen | m["c"] = 3 |
| Einen Wert lesen | v := m["a"] |
| Existenz prüfen | v, ok := m["x"] |
| Einen Schlüssel löschen | delete(m, "a") |
| Länge | len(m) |
| Durchlaufen | for k, v := range m { ... } |
Structs & Methoden
Structs gruppieren Felder; Methoden hängen Verhalten über einen Empfänger an.
| Operation | Syntax |
|---|---|
| Ein Struct definieren | type Point struct { X, Y int } |
| Eine Instanz erstellen | p := Point{X: 1, Y: 2} |
| Auf ein Feld zugreifen | p.X |
| Zeiger auf ein Struct | p := &Point{1, 2} |
| Methode mit Wert-Empfänger | func (p Point) Dist() float64 { ... } |
| Methode mit Zeiger-Empfänger | func (p *Point) Move(dx int) { p.X += dx } |
| Eingebettetes Struct | type Circle struct { Point; R int } |
| Struct-Tags | Name string mit einem in Backticks gesetzten json:"name"-Tag |
Interfaces
Interfaces werden implizit erfüllt - jeder Typ mit den passenden Methoden qualifiziert sich.
| Operation | Syntax |
|---|---|
| Ein Interface definieren | type Shape interface { Area() float64 } |
| Implementieren (implizit) | func (c Circle) Area() float64 { ... } |
| Leeres Interface (any) | var x interface{} oder var x any |
| Typzusicherung | s, ok := x.(string) |
| Type Switch | switch v := x.(type) { case int: ... } |
| Stringer-Interface | func (p Point) String() string { ... } |
Goroutinen & Channels
Goroutinen sind leichtgewichtige Threads; Channels reichen Werte zwischen ihnen weiter.
| Operation | Syntax |
|---|---|
| Eine Goroutine starten | go doWork() |
| Einen Channel erstellen | ch := make(chan int) |
| Gepufferter Channel | ch := make(chan int, 5) |
| An einen Channel senden | ch <- 42 |
| Von einem Channel empfangen | v := <-ch |
| Einen Channel schließen | close(ch) |
| Range über einen Channel | for v := range ch { ... } |
| Select auf Channels | select { case v := <-ch: ...; default: ... } |
| Wait Group | var wg sync.WaitGroup; wg.Add(1); wg.Wait() |
| Mutex | var mu sync.Mutex; mu.Lock(); mu.Unlock() |
Fehlerbehandlung
Go gibt Fehler als Werte zurück - es gibt keine Exceptions.
| Operation | Syntax |
|---|---|
| Einen Fehler zurückgeben | func read() (string, error) { return "", err } |
| Einen Fehler prüfen | if err != nil { return err } |
| Einen Fehler erstellen | errors.New("not found") |
| Formatierter Fehler | fmt.Errorf("bad id %d", id) |
| Einen Fehler umhüllen | fmt.Errorf("load: %w", err) |
| Auspacken / abgleichen | errors.Is(err, os.ErrNotExist) |
| Nach Typ abgleichen | errors.As(err, &target) |
| Panic / recover | defer func() { recover() }() |
Die Go-Syntax, die du am häufigsten brauchst, auf einer Seite. Dieser Go-Spickzettel ist eine Schnellreferenz für die Kernsprache - Variablen und Typen, Slices und Maps, Structs und Interfaces sowie die Goroutinen und Channels, mit denen Golang bei Nebenläufigkeit glänzt.
Alles hier ist Standard-Go und kompiliert mit der offiziellen Toolchain. Kopiere, was du brauchst, oder probiere jeden Codeschnipsel live im Go-Playground aus - keine Installation nötig.
Go-Spickzettel FAQ
Ist dieser Go-Spickzettel kostenlos?
Was ist der Unterschied zwischen := und var in Go?
var x = 0 deklariert eine Variable und funktioniert überall, auch auf Package-Ebene. x := 0 ist die kurze Variablendeklaration: Sie deklariert und weist zugleich zu, leitet den Typ ab und kann nur innerhalb einer Funktion verwendet werden. Verwende var, wenn du einen expliziten Typ oder eine Variable auf Package-Ebene brauchst, und := für kompakte lokale Deklarationen.Was sind Goroutinen und Channels?
go someFunc() schreibst. Channels sind typisierte Pipes, über die Goroutinen sicher kommunizieren: Eine Goroutine sendet mit ch <- v und eine andere empfängt mit <-ch. Zusammen bilden sie das zentrale Nebenläufigkeitsmodell von Go, festgehalten im Leitsatz „Teile Speicher durch Kommunikation".