Middle
Šta se može raditi sa zatvorenim kanalom u Go?
sobes.tech АИ
Одговор од АИ
При čitanju iz zatvorenog kanala možete dobiti sve preostale podatke koji su zapisani pre zatvaranja. Nakon što je kanal ispražnjen, sledeće operacije čitanja će vraćati nultu vrednost tipa elementa kanala i vrednost false kao drugu vrednost, što ukazuje da je kanal zatvoren.
Slanje podataka u zatvoreni kanal izazvaće paniku tokom izvršenja.
Pokušaj zatvaranja već zatvorenog kanala takođe će izazvati paniku.
Možete proveriti da li je kanal zatvoren koristeći operator ok pri čitanju:
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
// Čitanje iz zatvorenog kanala dok ne bude prazan
val1, ok1 := <-ch
fmt.Printf("Vrednost: %d, Ok: %t\n", val1, ok1) // Vrednost: 1, Ok: true
val2, ok2 := <-ch
fmt.Printf("Vrednost: %d, Ok: %t\n", val2, ok2) // Vrednost: 2, Ok: true
// Čitanje nakon što je kanal ispražnjen
val3, ok3 := <-ch
fmt.Printf("Vrednost: %d, Ok: %t\n", val3, ok3) // Vrednost: 0, Ok: false
// Pokušaj slanja u zatvoren kanal (izazvaće paniku)
// ch <- 3 // Uklonite komentar da izazovete paniku
// Pokušaj zatvaranja već zatvorenog kanala (izazvaće paniku)
// close(ch) // Uklonite komentar da izazovete paniku
}
Korišćenje range sa zatvorenim kanalom omogućava sekvencijalno čitanje podataka dok kanal ne bude ispražnjen, nakon čega se petlja automatski završava.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 3)
ch <- 10
ch <- 20
close(ch)
// Korišćenje range sa zatvorenim kanalom
for val := range ch {
fmt.Println(val) // Ispisaće 10, zatim 20
}
}