Wat kun je doen met een gesloten kanaal in Go?
sobes.tech AI
Antwoord van AI
Bij het lezen uit een gesloten kanaal, kun je alle resterende gegevens krijgen die vóór de sluiting zijn geschreven. Nadat het kanaal is geleegd, zullen volgende leesbewerkingen een null-waarde van het type van het kanaalelement en de waarde false als tweede teruggegeven, wat aangeeft dat het kanaal gesloten is.
Het verzenden van gegevens naar een gesloten kanaal veroorzaakt een panic tijdens de uitvoering.
Proberen een al gesloten kanaal te sluiten, veroorzaakt ook een panic tijdens de uitvoering.
Je kunt controleren of een kanaal gesloten is door de operator ok te gebruiken bij het lezen:
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
// Lezen uit een gesloten kanaal tot het leeg is
val1, ok1 := <-ch
fmt.Printf("Waarde: %d, Ok: %t\n", val1, ok1) // Waarde: 1, Ok: true
val2, ok2 := <-ch
fmt.Printf("Waarde: %d, Ok: %t\n", val2, ok2) // Waarde: 2, Ok: true
// Lezen nadat het kanaal leeg is
val3, ok3 := <-ch
fmt.Printf("Waarde: %d, Ok: %t\n", val3, ok3) // Waarde: 0, Ok: false
// Proberen te verzenden naar een gesloten kanaal (zal paniek veroorzaken)
// ch <- 3 // Verwijder de commentaarlijn om paniek te veroorzaken
// Proberen een gesloten kanaal te sluiten (zal paniek veroorzaken)
// close(ch) // Verwijder de commentaarlijn om paniek te veroorzaken
}
Het gebruik van range met een gesloten kanaal maakt het mogelijk om gegevens sequentieel te lezen totdat het kanaal leeg is, waarna de lus automatisch eindigt.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 3)
ch <- 10
ch <- 20
close(ch)
// Gebruik van range met een gesloten kanaal
for val := range ch {
fmt.Println(val) // Zal 10, dan 20 afdrukken
}
}