Închiderea canalului
După inițializare, canalul este gata să transmită date. Acesta se află într-o stare deschisă, iar noi putem interacționa cu el până când este închis folosind funcția încorporată close():
package main
import "fmt"
func main() {
intCh := make(chan int, 3)
intCh <- 10
intCh <- 3
close(intCh)
// intCh <- 24 // eroare - canalul este deja închis
fmt.Println(<-intCh) // 10
fmt.Println(<-intCh) // 3
fmt.Println(<-intCh) // 0
}
După închiderea canalului, nu vom mai putea trimite date noi în acesta. Dacă încercăm acest lucru, vom obține o eroare. Totuși, putem obține datele deja adăugate anterior. Însă, dacă încercăm să obținem date din canal care nu există, vom primi valoarea implicită. De exemplu, în exemplul de mai sus, în canal sunt adăugate două valori. La încercarea de a obține o a treia valoare, care nu există în canal, vom primi valoarea implicită - numărul 0.
Pentru a evita situațiile în care canalul este deja închis, putem verifica starea canalului. Mai precis, din canal putem obține două valori:
val, opened := <-intCh
Prima valoare, val, reprezintă datele propriu-zise din canal, iar opened reprezintă valoarea logică care va fi true dacă canalul este deschis și putem citi date din el cu succes. De exemplu, putem verifica starea canalului folosind o structură condițională:
package main
import "fmt"
func main() {
intCh := make(chan int, 3)
intCh <- 10
intCh <- 3
close(intCh) // canalul este închis
for i := 0; i < cap(intCh); i++ {
if val, opened := <-intCh; opened {
fmt.Println(val)
} else {
fmt.Println("Canalul este închis!")
}
}
}
Ieșirea în consolă a programului va fi:
10
3
Canalul este închis!