Middle
Was kann man mit der Flowsicherheit in Kanälen in Go machen und was nicht?
sobes.tech KI
Antwort von AI
Man kann:
- Daten senden und empfangen. Jeder Lese- und Schreibvorgang in einem Kanal ist eine atomare Operation.
- Einen Kanal schließen. Das Schließen signalisiert, dass keine Daten mehr gesendet werden.
- Den Operator
selectfür nicht-blockierende Interaktion mit mehreren Kanälen verwenden. - Gepufferte und ungepufferte Kanäle für verschiedene Synchronisationsszenarien nutzen.
Man darf nicht:
- Einen Kanal gleichzeitig von mehreren Goroutinen ohne zusätzliche Synchronisation schließen. Das kann zu einem Panic führen.
- Einen bereits geschlossenen Kanal schließen. Das führt ebenfalls zu einem Panic.
- Daten in einen geschlossenen Kanal senden. Das verursacht einen Panic.
- Auf das Lesen eines null (nicht initialisierten) Kanals warten. Das blockiert die Goroutine.
- Auf das Schreiben in einen null (nicht initialisierten) Kanal warten. Das blockiert die Goroutine.
Beispiel für die Verwendung von Kanälen:
// Erstellen eines ungepufferten Kanals für int
messages := make(chan int)
// Goroutine zum Senden von Daten
go func() {
messages <- 1 // Senden von 1 in den Kanal
messages <- 2 // Senden von 2 in den Kanal
close(messages) // Schließen des Kanals nach dem Senden
}()
// Lesen von Daten aus dem Kanal
firstMessage := <-messages
secondMessage := <-messages
// Das Lesen aus einem geschlossenen Kanal gibt den Nullwert und ok=false zurück
value, ok := <-messages