- Dynamic Sidebar mit window.COURSES_MANIFEST für 13 Kurse (216 Kapitel) - Kurswechsler Dropdown mit Direktnavigation - Fortschrittsanzeige mit Solved-Checkmarks (✓) aus localStorage - Responsive Off-Canvas Drawer mit Floating Action Button (☰ Kapitel) & Backdrop auf Mobile/Tablets - Web-IDE Topbar Drawer-Button (☰ Kapitel) für unterbrechungsfreien Vollbild-Editor - Saubere Bereinigung redundanter statischer Legacy-Sidebars
109 lines
5.5 KiB
HTML
109 lines
5.5 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="de">
|
||
<head>
|
||
<link rel="icon" type="image/svg+xml" href="../../../assets/favicon.svg">
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Go 02: Slices, Dynamische Arrays & Maps</title>
|
||
<link rel="stylesheet" href="../../../assets/style.css">
|
||
</head>
|
||
<body>
|
||
<div class="app-layout">
|
||
<div class="app-main">
|
||
<header>
|
||
<div class="header-container">
|
||
<div class="header-badge">⚡ Go Datenstrukturen</div>
|
||
<h1>Go 02: Slices, Dynamische Arrays & Assoziative Maps</h1>
|
||
<p>Verstehe die interne Datenstruktur von Slices (Pointer, Len, Cap), dynamisches Anhängen mit <code>append()</code>, Reslicing und Key-Value Speicherung in Maps.</p>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="container">
|
||
<!-- 1. THEORIE: SLICES VS ARRAYS -->
|
||
<section class="card">
|
||
<h2>📦 1. Arrays fester Länge vs. Dynamische Slices</h2>
|
||
<p>In Go haben Arrays eine starre Größe, die fest zum Datentyp gehört (z.B. <code>[4]int</code>). In der Praxis arbeiten wir fast ausschließlich mit <strong>Slices</strong> (<code>[]int</code>), die wie dynamische Fenster über ein zugrundeliegendes Array gelegt werden:</p>
|
||
|
||
<pre><code>// 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)</code></pre>
|
||
|
||
<div class="box box-analogie">
|
||
<div class="box-title">🏢 Didaktische Analogie: Das Notizbuch vs. Der Notizblock</div>
|
||
<p>Ein <strong>Array</strong> ist ein gebundenes Buch mit fest 100 Seiten – ist es voll, kannst du keine Seite mehr einfügen. Ein <strong>Slice</strong> ist wie ein kleiner Buchstreifen, der genau auf 3 Seiten zeigt (<code>len=3</code>). Brauchst du mehr Platz, kopiert <code>append()</code> deine Notizen automatisch in ein doppelt so großes Notizbuch (<code>cap</code>-Verdopplung) im Hintergrund!</p>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 2. THEORIE: RESLICING -->
|
||
<section class="card">
|
||
<h2>✂️ 2. Slicing & Sub-Slices (Halboffene Intervalle)</h2>
|
||
<p>Slices lassen sich mit der Syntax <code>[start:ende]</code> beliebig zuschneiden (Start inklusive, Ende exklusive):</p>
|
||
|
||
<pre><code>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"]</code></pre>
|
||
</section>
|
||
|
||
<!-- 3. THEORIE: MAPS & COMMA-OK -->
|
||
<section class="card">
|
||
<h2>🗺️ 3. Assoziative Maps & das Comma-OK Idiom</h2>
|
||
<p>Maps sind hochperformante Hash-Tabellen zur Zuordnung von Schlüsseln zu Werten:</p>
|
||
|
||
<pre><code>// 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")</code></pre>
|
||
</section>
|
||
|
||
<!-- 4. AUFGABEN CHECKLISTE -->
|
||
<section class="card">
|
||
<h2>🎯 Aufgaben & Checkliste in <code>aufgabe.go</code></h2>
|
||
<div class="task-item">
|
||
<input type="checkbox" class="task-checkbox" id="t1">
|
||
<label class="task-label" for="t1"><strong>TODO 1:</strong> <code>FiltereGeradeZahlen(zahlen []int) []int</code> mit <code>make()</code> und <code>append()</code> implementieren.</label>
|
||
</div>
|
||
<div class="task-item">
|
||
<input type="checkbox" class="task-checkbox" id="t2">
|
||
<label class="task-label" for="t2"><strong>TODO 2:</strong> <code>ErweitereProtokolle(logs []string, neueEintraege ...string) []string</code> implementieren.</label>
|
||
</div>
|
||
<div class="task-item">
|
||
<input type="checkbox" class="task-checkbox" id="t3">
|
||
<label class="task-label" for="t3"><strong>TODO 3:</strong> <code>ZaehleWortHaeufigkeit(text string) map[string]int</code> mit <code>strings.Fields</code> umsetzen.</label>
|
||
</div>
|
||
<div class="task-item">
|
||
<input type="checkbox" class="task-checkbox" id="t4">
|
||
<label class="task-label" for="t4"><strong>TODO 4:</strong> <code>SichereBenutzerAbfrage(users map[string]int, username string) (int, bool)</code> und <code>LoescheBenutzer(users map[string]int, username string)</code> implementieren.</label>
|
||
</div>
|
||
|
||
<div style="margin-top: 25px; display: flex; gap: 12px; flex-wrap: wrap;">
|
||
<a href="../../../workspace.html?course=go&track=track_1_go_basics&chapter=02_slices_arrays_und_maps" class="btn" style="background: #00add8; color: #fff; font-weight: 700;">💻 In Web-IDE öffnen →</a>
|
||
<a href="../03_kontrollfluss_und_schleifen/index.html" class="btn btn-secondary">Weiter zu Go 03 →</a>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
</div>
|
||
</div>
|
||
<script src="../../../assets/courses_manifest.js"></script>
|
||
<script src="../../../assets/course_sidebar.js"></script>
|
||
</body>
|
||
</html>
|