Middle
Millised tagajärjed võivad tekkida, kui loete suletud kanalist Go-s?
sobes.tech AI
Vastus AI-lt
Kanali sulgemisel loetakse kohe kanali elementide tüüpi nullväärtus ilma blokeerimiseta. Kui on olemas teine boolean-parameeter, siis see on false.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1) // Puhverkanal
ch <- 1
close(ch)
val, ok := <-ch // Loeb suletud kanalilt
fmt.Printf("Väärtus: %d, Avatud: %t\n", val, ok) // Väljund "Väärtus: 1, Avatud: true"
val, ok = <-ch // Korduv lugemine samast suletud kanalist
fmt.Printf("Väärtus: %d, Avatud: %t\n", val, ok) // Väljund "Väärtus: 0, Avatud: false"
// Järgmised lugemised suletud kanalilt
val, ok = <-ch
fmt.Printf("Väärtus: %d, Avatud: %t\n", val, ok) // Väljund "Väärtus: 0, Avatud: false"
}
Peamised tagajärjed:
- Nullväärtuse saamine: Programm ei kuku kokku, kuid saab kanali tüübi jaoks vaikimisi nullväärtuse.
- Suletuse indikaator: Teine boolean-parameeter, kui seda kasutatakse, muutub
false, mis näitab, et kanal on suletud ja saadud väärtus on nullväärtus. - Mittblokiv lugemine: Lugemisoperatsioon ei blokeeri gorutini.
- Ilma pannikuta: Erinevalt suletud kanalile kirjutamisest ei põhjusta lugemine pannikut.
Võrdlus avatud ja suletud kanali lugemisest:
| Kanali seisund | Operatsioon | Käitumine | Tagastatav väärtus (kui on olemas teine parameeter) |
|---|---|---|---|
| Avatud | <-ch |
Blokeerib kuni väärtuse saamiseni või sulgemiseni | Väärtus, true |
| Avatud | val, ok := <-ch |
Blokeerib kuni väärtuse saamiseni või sulgemiseni | Väärtus, true |
| Suletud | <-ch |
Kohe saadav | Nullväärtus |
| Suletud | val, ok := <-ch |
Kohe saadav | Nullväärtus, false |
Teise boolean-parameetri kasutamine on soovitatav, et määrata, kas on edukalt saadud tõeline element kanali või kanal on suletud.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1)
ch <- 1
close(ch)
for {
val, ok := <-ch
if !ok {
fmt.Println("Kanal on suletud, väljumine tsüklist.")
break
}
fmt.Printf("Saadud väärtus: %d\n", val)
}
}
Selline käitumine võimaldab elegantset gorutinate töö lõpetamist pärast kanali sulgemist.