Middle
Čo sa dá robiť so zatvoreným kanálom v Go?
sobes.tech AI
Odpoveď od AI
Pri čítaní z uzavretého kanála môžete získať všetky zostávajúce údaje, ktoré boli napísané pred zatvorením. Po vyprázdnení kanála budú nasledujúce operácie čítania vracať nulovú hodnotu typu prvku kanála a hodnotu false ako druhú hodnotu, čo naznačuje, že kanál je zatvorený.
Odoslanie údajov do uzavretého kanála spôsobí počas behu pániku.
Pokus o zatvorenie už zatvoreného kanála tiež spôsobí počas behu pániku.
Môžete skontrolovať, či je kanál zatvorený, pomocou operátora ok pri čítaní:
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
// Čítanie zo zatvoreného kanála, kým nie je prázdny
val1, ok1 := <-ch
fmt.Printf("Hodnota: %d, Ok: %t\n", val1, ok1) // Hodnota: 1, Ok: true
val2, ok2 := <-ch
fmt.Printf("Hodnota: %d, Ok: %t\n", val2, ok2) // Hodnota: 2, Ok: true
// Čítanie po vyprázdnení kanála
val3, ok3 := <-ch
fmt.Printf("Hodnota: %d, Ok: %t\n", val3, ok3) // Hodnota: 0, Ok: false
// Pokus o odoslanie do zatvoreného kanála (spôsobí panic)
// ch <- 3 // Odkomentujte pre vyvolanie panic
// Pokus o zatvorenie už zatvoreného kanála (spôsobí panic)
// close(ch) // Odkomentujte pre vyvolanie panic
}
Použitie range so zatvoreným kanálom umožňuje sekvenčné čítanie údajov, kým nie je kanál vyprázdnený, po čom sa cyklus automaticky ukončí.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 3)
ch <- 10
ch <- 20
close(ch)
// Použitie range so zatvoreným kanálom
for val := range ch {
fmt.Println(val) // Vypíše 10, potom 20
}
}