Aufgaben-Python/courses/go/10_channels_und_datenfluss/README.md

56 lines
2.2 KiB
Markdown

# 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 zu `n` Elemente 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
```go
// 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`
1. **TODO 1 (`LogRecord`)**: Definiere das Struct `LogRecord` mit `ID int`, `Level string` ("INFO", "WARN", "ERROR"), `Message string` und `Source string`.
2. **TODO 2 (`ProduceLogs`)**: Erstelle einen Generator `ProduceLogs(records []LogRecord) <-chan LogRecord`, der alle Records in einer Hintergrund-Goroutine sendet und den Kanal am Ende schließt.
3. **TODO 3 (`FilterLogs`)**: Schreibe die Pipeline-Stufe `FilterLogs(in <-chan LogRecord, targetLevel string) <-chan LogRecord`, die nur Einträge mit `Level == targetLevel` an den Ausgangskanal weiterleitet.
4. **TODO 4 (`CountLogsByLevel`)**: Schreibe die Aggregator-Funktion `CountLogsByLevel(in <-chan LogRecord) map[string]int`, die alle Events liest und ein Dictionary mit den Vorkommen pro Log-Level zurückgibt.
---
## 🧪 Tests ausführen
```bash
go test -v ./...
```