- 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 |
||
|---|---|---|
| .. | ||
| aufgabe.go | ||
| index.html | ||
| musterloesung.go | ||
| README.md | ||
| test_aufgabe.go | ||
Go 10: Channels, Pufferung & Daten-Pipelines 📦
Willkommen zu Modul 10 des Go Cloud & Concurrency Lehrpfads!
Channels sind das Herzstück von Gos Concurrency-Philosophie (nach Hoares CSP – Communicating Sequential Processes). In diesem Modul baust du datengetriebene Streaming-Pipelines zur Verarbeitung strukturierter Server-Logs.
💡 1. Das Wichtigste in Kürze
Channel-Typen
- Ungepuffert (
make(chan T)): Senden und Empfangen finden zeitgleich statt (Handshake / Rendezvous). Blockiert, bis die Gegenseite bereit ist. - Gepuffert (
make(chan T, n)): Fasst bis zunElemente in einer Warteschlange. Senden blockiert erst, wenn der Puffer voll ist.
Channel-Direktionen
chan T: Bidirektionaler Kanal (kann senden und empfangen).chan<- T: Send-only Kanal (darf nur befüllt werden:ch <- item).<-chan T: Receive-only Kanal (darf nur ausgelesen werden:item := <-ch).
Sauberes Schließen und Iterieren
// Producer:
func Generator() <-chan int {
out := make(chan int, 10)
go func() {
defer close(out) // Wichtig: Immer schließen, wenn keine Daten mehr folgen!
for i := 1; i <= 5; i++ {
out <- i
}
}()
return out
}
// Consumer:
ch := Generator()
for val := range ch { // for..range bricht automatisch ab, sobald der Channel geschlossen ist
fmt.Println(val)
}
🎯 Aufgaben in aufgabe.go
- TODO 1 (
LogRecord): Definiere das StructLogRecordmitID int,Level string("INFO", "WARN", "ERROR"),Message stringundSource string. - TODO 2 (
ProduceLogs): Erstelle einen GeneratorProduceLogs(records []LogRecord) <-chan LogRecord, der alle Records in einer Hintergrund-Goroutine sendet und den Kanal am Ende schließt. - TODO 3 (
FilterLogs): Schreibe die Pipeline-StufeFilterLogs(in <-chan LogRecord, targetLevel string) <-chan LogRecord, die nur Einträge mitLevel == targetLevelan den Ausgangskanal weiterleitet. - TODO 4 (
CountLogsByLevel): Schreibe die Aggregator-FunktionCountLogsByLevel(in <-chan LogRecord) map[string]int, die alle Events liest und ein Dictionary mit den Vorkommen pro Log-Level zurückgibt.
🧪 Tests ausführen
go test -v ./...