⚡ Go Datenstrukturen

Go 02: Slices, Dynamische Arrays & Assoziative Maps

Verstehe die interne Datenstruktur von Slices (Pointer, Len, Cap), dynamisches Anhängen mit append(), Reslicing und Key-Value Speicherung in Maps.

📦 1. Arrays fester Länge vs. Dynamische Slices

In Go haben Arrays eine starre Größe, die fest zum Datentyp gehört (z.B. [4]int). In der Praxis arbeiten wir fast ausschließlich mit Slices ([]int), die wie dynamische Fenster über ein zugrundeliegendes Array gelegt werden:

// 1. Array mit fester Größe (Werttyp, wird bei Übergabe komplett kopiert)
var festesArray [3]string = [3]string{"node1", "node2", "node3"}

// 2. Slice-Header: Verweist auf Speicher (Pointer, Länge, Kapazität)
dynamischesSlice := []string{"auth", "billing"}

// 3. make() mit vorallokierter Kapazität zur Leistungsoptimierung:
gepufferteDaten := make([]int, 0, 100) // len=0, cap=100

// 4. append() fügt Elemente hinzu (verdoppelt Kapazität bei Bedarf):
gepufferteDaten = append(gepufferteDaten, 42, 84, 126)
🏢 Didaktische Analogie: Das Notizbuch vs. Der Notizblock

Ein Array ist ein gebundenes Buch mit fest 100 Seiten – ist es voll, kannst du keine Seite mehr einfügen. Ein Slice ist wie ein kleiner Buchstreifen, der genau auf 3 Seiten zeigt (len=3). Brauchst du mehr Platz, kopiert append() deine Notizen automatisch in ein doppelt so großes Notizbuch (cap-Verdopplung) im Hintergrund!

✂️ 2. Slicing & Sub-Slices (Halboffene Intervalle)

Slices lassen sich mit der Syntax [start:ende] beliebig zuschneiden (Start inklusive, Ende exklusive):

cluster := []string{"node-0", "node-1", "node-2", "node-3", "node-4"}

sub1 := cluster[1:4] // ["node-1", "node-2", "node-3"] (Länge 3)
sub2 := cluster[:2]  // ["node-0", "node-1"]
sub3 := cluster[3:]  // ["node-3", "node-4"]

🗺️ 3. Assoziative Maps & das Comma-OK Idiom

Maps sind hochperformante Hash-Tabellen zur Zuordnung von Schlüsseln zu Werten:

// Map initialisieren
ports := make(map[string]int)
ports["http"] = 80
ports["https"] = 443
ports["ssh"] = 22

// Sicheres Auslesen mit Comma-OK Idiom:
val, exists := ports["postgres"]
if !exists {
    fmt.Println("Schlüssel existiert nicht!")
}

// Schlüssel löschen:
delete(ports, "ssh")

🎯 Aufgaben & Checkliste in aufgabe.go

💻 In Web-IDE öffnen → Weiter zu Go 03 →