📦 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)
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")