Sobes.tech
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 select fü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