Sobes.tech
Middle

Was kann man mit einem geschlossenen Kanal in Go machen?

sobes.tech KI

Antwort von AI

Beim Lesen aus einem geschlossenen Kanal können alle verbleibenden Daten abgerufen werden, die vor dem Schließen geschrieben wurden. Nachdem der Kanal geleert wurde, geben nachfolgende Leseoperationen einen Nullwert des Elementtyps des Kanals und den Wert false als zweiten Rückgabewert zurück, was darauf hinweist, dass der Kanal geschlossen ist.

Das Senden von Daten an einen geschlossenen Kanal führt zu einem Laufzeit-Panik.

Der Versuch, einen bereits geschlossenen Kanal zu schließen, führt ebenfalls zu einem Laufzeit-Panik.

Sie können überprüfen, ob ein Kanal geschlossen ist, indem Sie den Operator ok beim Lesen verwenden:

package main

import (
	"fmt"
)

func main() {
	ch := make(chan int, 2)
	ch <- 1
	ch <- 2
	close(ch)

	// Lesen aus einem geschlossenen Kanal, bis er leer ist
	val1, ok1 := <-ch
	fmt.Printf("Wert: %d, Ok: %t\n", val1, ok1) // Wert: 1, Ok: true

	val2, ok2 := <-ch
	fmt.Printf("Wert: %d, Ok: %t\n", val2, ok2) // Wert: 2, Ok: true

	// Lesen nach dem Leeren des Kanals
	val3, ok3 := <-ch
	fmt.Printf("Wert: %d, Ok: %t\n", val3, ok3) // Wert: 0, Ok: false

	// Versuch, in einen geschlossenen Kanal zu senden (führt zu einem Panic)
	// ch <- 3 // Diese Zeile auskommentieren, um einen Panic zu verursachen

	// Versuch, einen geschlossenen Kanal zu schließen (führt zu einem Panic)
	// close(ch) // Diese Zeile auskommentieren, um einen Panic zu verursachen
}

Die Verwendung von range mit einem geschlossenen Kanal ermöglicht das sequenzielle Lesen der Daten, bis der Kanal leer ist, woraufhin die Schleife automatisch endet.

package main

import (
	"fmt"
)

func main() {
	ch := make(chan int, 3)
	ch <- 10
	ch <- 20
	close(ch)

	// Verwendung von range mit einem geschlossenen Kanal
	for val := range ch {
		fmt.Println(val) // Gibt 10, dann 20 aus
	}
}