Modul 1: Getting Started — go mod init & das erste Programm
Go-Grundlagen: Was ist Go, Projektaufbau mit go mod, das erste Programm, Tooling (gofmt, go vet, go test) und die Standardbibliothek.
Was ist Go? Eine Sprache für echte Systeme
Lektion 1 von 5
Warum Go existiert
Go (oft „Golang" genannt) wurde ab 2007 bei Google von Robert Griesemer, Rob Pike und Ken Thompson entwickelt — als Antwort auf die Probleme großer C++-Codebasen: lange Builds, komplexe Nebenläufigkeit, umständliche Tooling-Ketten.
Das Ergebnis ist eine einfache Sprache für komplexe Systeme:
- Schnelle Builds — ein Projekt mit tausenden Dateien kompiliert in Sekunden.
- Eingebaute Concurrency —
go func() { ... }()startet eine Goroutine; Kommunikation über Channels, kein Shared-State-Threading. - Ein Tooling-Kit —
gofmterzwingt ein Format,go testist Teil der Sprache,go vetfängt echte Fehler,go modverwaltet Abhängigkeiten. - Statisch typisiert und kompiliert — ein einzelnes Binary, läuft überall ohne Laufzeitumgebung.
// Das berühmteste kurze Go-Programm — zeigt die Essenz:
// ein main-Paket, eine main-Funktion, kein Semikolon-Zwang, keine Klassen.
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
Pakete sind die Einheit
In Go ist alles ein Paket. Jede Datei startet mit package <name>. Das
Programm beginnt im Paket main mit der Funktion func main(). Code in
anderen Paketen (wie fmt) wird mit import hereingeholt — Importe, die du
nicht nutzt, sind ein Fehler beim Kompilieren.
Wo Go zuhause ist
- Infrastruktur-Tools: Kubernetes, Docker, Terraform, Hugo, Caddy
- CLI-Tools: jeder moderne CLI ist oft in Go gebaut (schnell, ein Binary)
- Netzwerkdienste: HTTP-Server, Proxys, Load Balancer
- DevOps & SRE: Monitoring-Agenten, Konfigurationsgeneratoren
✅ Wichtige Erkenntnisse
Haken setzen, um deinen Lernfortschritt zu markieren:
Dein erstes Programm: go mod init, go run, go build
Lektion 2 von 5
Die drei Befehle, die du am Anfang brauchst
go mod init <modul> legt ein neues Go-Modul an (erzeugt go.mod).
go run . kompiliert und führt dein Programm aus. go build erzeugt
das Binary.
# Projekt anlegen
mkdir hello && cd hello
go mod init hello
# hello.go schreiben, dann ausführen
go run .
# Hallo, Go!
# und ein Binary bauen (heißt hello auf Linux/Mac, hello.exe auf Windows)
go build -o hello
// hello.go
package main
import "fmt"
func main() {
fmt.Println("Hallo, Go!")
}
go.mod — das Modul-Manifest
go.mod ist die eine Datei, die jedes Go-Projekt definiert. Sie heißt das
Modul (z. B. hello oder dein echter Domain-Pfad wie
github.com/name/projekt) und listet Go-Version und Abhängigkeiten.
module hello
go 1.24
Ein Wort zu den Semikolons
Go braucht keine Semikolons, aber der Compiler fügt sie automatisch am Zeilenende ein. Deshalb sind diese zwei Programmierfehler klassisch, die NICHT funktionieren:
// So NICHT — das öffnende { gehört ans Gleichheitszeichen.
func main()
{
}
// So ja — Sieht kurz aus, ist aber die ganze Regel:
func main() {
}
✅ Wichtige Erkenntnisse
Haken setzen, um deinen Lernfortschritt zu markieren:
Tooling, das mitkommt: gofmt, go vet, go test
Lektion 3 von 5
Dein Werkzeugkoffer
Go liefert die Qualitäts-Tools als Teil der Sprache — nichts extra installieren:
| Befehl | Was es tut |
|---|---|
gofmt -w file.go | Formatiert deinen Code auf den offiziellen Standard |
go vet ./... | Findet verdächtige Konstrukte (nicht nur Syntax) |
go test ./... | Führt Tests aus — Testen ist eingebaut |
go doc <paket> | Zeigt die Doku eines Pakets im Terminal |
go run . | Führt das aktuelle Paket aus |
go build ./... | Kompiliert alles ohne auszuführen |
gofmt beendet alle Flames
In Go gibt es eine offizielle Formatierung, erzwingbar mit gofmt
(bzw. go fmt ./... im Projekt). Ob Tabs oder Spaces, ob { auf eine neue
Zeile — nur diese eine Antwort ist richtig. So liest jedes Struktur-Team jede
Datei gleich.
go vet fängt echte Fehler
package main
import "fmt"
func main() {
weight := 12
height := 1.70
// vet warnt: mismatched types int und float64 — das ist NICHT gemeint!
index := weight / height
fmt.Println(index)
}
go vet meldet hier die Typen-Mischung. Richtige Version: beide Werte
explizit in float64 umwandeln — mehr dazu in Modul 2.
✅ Wichtige Erkenntnisse
Haken setzen, um deinen Lernfortschritt zu markieren:
Die Standardbibliothek — deine Superkraft
Lektion 4 von 5
fmt, strings, os, sort
Die Go-Standardbibliothek ist groß und durchdacht — die meisten Aufgaben löst du, ohne je ein Paket aus dem Netz zu installieren.
package main
import (
"fmt"
"os"
"sort"
"strings"
)
func main() {
// fmt.Sprintf: Text zusammensetzen
msg := fmt.Sprintf("Nutzer: %s, Versuche: %d", "ana", 3)
// strings: alles rund um Text
upper := strings.ToUpper("hello")
parts := strings.Split("a,b,c", ",") // ["a" "b" "c"]
// sort: in-place sortieren
nums := []int{3, 1, 2}
sort.Ints(nums) // [1 2 3]
// os: Argumente und Umgebung
args := os.Args[1:]
fmt.Println(msg, upper, parts, nums, args)
}
Es gibt KEINE Klassen, aber Methoden
Bei Strings, Slices, Maps — alles sind Werte mit Methoden. strings. ToUpper ist eine Funktion der Bibliothek, nicht eine Methode an der Klasse
String. Trotzdem kann man eigene Typen mit Methoden versehen (Modul 2,
Lektion 10).
Doku im Terminal: go doc
# Die Signatur einer Funktion ansehen
go doc strings.Split
# Die ganze Dokumentation zum Paket
go doc strings | head -20
✅ Wichtige Erkenntnisse
Haken setzen, um deinen Lernfortschritt zu markieren:
Tests schreiben: go test ist Teil der Sprache
Lektion 5 von 5
Testen ist kein Extra-Ding
In Go schreibst du Tests mit dem eingebauten testing-Paket. Eine Datei
file_test.go neben dem Code, eine Funktion TestXxx(t *testing.T), und
go test läuft — ohne Framework, ohne Mocking-Bibliothek, ohne Konfiguration.
// add.go
package main
func add(a, b int) int {
return a + b
}
// add_test.go
package main
import "testing"
func TestAdd(t *testing.T) {
if got := add(2, 3); got != 5 {
t.Errorf("add(2, 3) = %d, erwartet 5", got)
}
}
go test ./...
# ok hello 0.002s
Table-Driven Tests — das Go-Muster
Statt viele Testfunktionen zu schreiben, nutzt Go das Table-Driven-Muster: eine Tabelle aus Eingaben und erwarteten Ausgaben, eine Schleife, ein Test.
func TestAddTable(t *testing.T) {
cases := []struct {
a, b, want int
}{
{2, 3, 5},
{0, 0, 0},
{-1, 1, 0},
}
for _, c := range cases {
if got := add(c.a, c.b); got != c.want {
t.Errorf("add(%d, %d) = %d, want %d", c.a, c.b, got, c.want)
}
}
}
Wochen-Check Modul 1
Nimm dir 3 Minuten: Beantworte die vier Fragen aus diesem Modul ohne Hilfe. Richtig beantwortet? Weiter zu Modul 2.
✅ Wichtige Erkenntnisse
Haken setzen, um deinen Lernfortschritt zu markieren: