Middle
Ką galima daryti su uždaru kanalu Go?
sobes.tech AI
Atsakymas iš AI
Uždarus kanale skaitydami galite gauti visus likusius duomenis, kurie buvo įrašyti iki uždarymo. Po kanalo ištuštinimo, vėlesnės skaitymo operacijos grąžins nulio reikšmę kanalo elemento tipui ir antrąją reikšmę false, nurodant, kad kanalas uždarytas.
Duomenų siuntimas į uždarytą kanalą sukels vykdymo metu paniką.
Bandymas uždaryti jau uždarytą kanalą taip pat sukels paniką.
Galite patikrinti, ar kanalas uždarytas, naudodami ok operatorių skaitymo metu:
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
// Skaitymas iš uždaryto kanalo, kol jis nėra tuščias
val1, ok1 := <-ch
fmt.Printf("Reikšmė: %d, Ok: %t\n", val1, ok1) // Reikšmė: 1, Ok: true
val2, ok2 := <-ch
fmt.Printf("Reikšmė: %d, Ok: %t\n", val2, ok2) // Reikšmė: 2, Ok: true
// Skaitymas po kanalo ištuštinimo
val3, ok3 := <-ch
fmt.Printf("Reikšmė: %d, Ok: %t\n", val3, ok3) // Reikšmė: 0, Ok: false
// Bandymas siųsti į uždarytą kanalą (sukels paniką)
// ch <- 3 // Komentuokite šią eilutę, kad sukeltumėte paniką
// Bandymas uždaryti jau uždarytą kanalą (sukels paniką)
// close(ch) // Komentuokite šią eilutę, kad sukeltumėte paniką
}
Naudojant range su uždarytu kanalu, galima nuosekliai skaityti duomenis iki kanalas bus ištuštintas, po to ciklas automatiškai baigiasi.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 3)
ch <- 10
ch <- 20
close(ch)
// Naudojant range su uždarytu kanalu
for val := range ch {
fmt.Println(val) // Išves 10, tada 20
}
}