Sobes.tech
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
	}
}