Middle
Go'да жабылган каналдан окуу учурунда кандай натыйжалар болушу мүмкүн?
sobes.tech AI
AIден жооп
Жабык каналдан окуу каналдын элементтеринин тиби үчүн нөл маанисин алууга алып келет жана блоктогон эмес. Эгер экинчи булев параметр бар болсо, ал false болот.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1) // Багдарланган канал
ch <- 1
close(ch)
val, ok := <-ch // Жабык каналдан окуу
fmt.Printf("Маани: %d, Ачык: %t\n", val, ok) // Натыйжа "Маани: 1, Ачык: true" болот
val, ok = <-ch // Ошол эле жабык каналдан кайра окуу
fmt.Printf("Маани: %d, Ачык: %t\n", val, ok) // Натыйжа "Маани: 0, Ачык: false" болот
// Жабык каналдан кийинки окуулар
val, ok = <-ch
fmt.Printf("Маани: %d, Ачык: %t\n", val, ok) // Натыйжа "Маани: 0, Ачык: false" болот
}
Негизги натыйжалар:
- Нөл маанисин алуу: Программа кулап калбайт, бирок каналдын тибине ылайык нөл маанисин алат.
- Жабыктык көрсөткүч: Экинчи булев параметр, эгер колдонулса,
falseболот, ал канал жабык жана алынган мааниси нөл экенин билдирет. - Блоктогон эмес окуу: Окуу операциясы горутинаны блоктобойт.
- Паникасыз: Жабык каналга жазуу сыяктуу эле, жабык каналдан окуу паника тийгизбейт.
Жабык жана ачык каналдан окуунун салыштырылышы:
| Каналдын абалы | Операция | Аракет | Кайтарылган мааниси (экинчи параметр бар болсо) |
|---|---|---|---|
| Ачык | <-ch |
Маалымат алуу үчүн блоктоо же жабуу | Маалымат, true |
| Ачык | val, ok := <-ch |
Маалымат алуу үчүн блоктоо же жабуу | Маалымат, true |
| Жабык | <-ch |
Жылдам алуу | Нөл мааниси |
| Жабык | val, ok := <-ch |
Жылдам алуу | Нөл мааниси, false |
Экинчи булев параметр колдонуу, ал эми ал каналдан реалдуу элементтин ийгиликтүү алынганын же жабылганын аныктоо үчүн сунушталат.
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 1)
ch <- 1
close(ch)
for {
val, ok := <-ch
эгер !ok {
fmt.Println("Канал жабык, циклден чыгуу.")
break
}
fmt.Printf("Алынып жаткан мааниси: %d\n", val)
}
}
Бул жүрүм-турум горутиналардын ишин жагымдуу түрдө аяктоого мүмкүндүк берет, алар канал жабылгандан кийин окуйт.