Middle
Ի՞նչ կարելի է անել փակված ալիքով Go-ում։
sobes.tech AI
Պատասխան AI-ից
Երբ կարդում եք փակված ալիքից, կարող եք ստանալ բոլոր մնացած տվյալները, որոնք գրանցվել են փակելուց առաջ: Երբ ալիքը դատարկվում է, հաջորդ ընթերցումները կվերադարձնեն ալիքի տարրի տեսակի զրոյական արժեքը և երկրորդ արժեքը false, ինչը ցույց է տալիս, որ ալիքը փակ է:
Փակված ալիքին տվյալներ ուղարկելը ժամանակային սխալ է առաջացնում:
Ալիքը փակելու փորձը, որը արդեն փակ է, նույնպես առաջացնում է ժամանակային սխալ:
Դուք կարող եք ստուգել, արդյոք ալիքը փակ է, օգտագործելով ok օպերատորը ընթերցման ժամանակ:
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
// Փակված ալիքից ընթերցում մինչև դատարկվելը
val1, ok1 := <-ch
fmt.Printf("Արժեք: %d, Ok: %t\n", val1, ok1) // Արժեք: 1, Ok: true
val2, ok2 := <-ch
fmt.Printf("Արժեք: %d, Ok: %t\n", val2, ok2) // Արժեք: 2, Ok: true
// Ընթերցում ալիքի դատարկվելուց հետո
val3, ok3 := <-ch
fmt.Printf("Արժեք: %d, Ok: %t\n", val3, ok3) // Արժեք: 0, Ok: false
// Փորձել ուղարկել փակ ալիքին (կառուցում է panic)
// ch <- 3 // Կոմենտավորեք այս տողը, որպեսզի առաջացնի panic
// Փակել արդեն փակ ալիք (կառուցում է panic)
// close(ch) // Կոմենտավորեք այս տողը, որպեսզի առաջացնի panic
}
Օգտագործել range փակված ալիքով թույլ է տալիս տվյալները հերթականությամբ կարդալ մինչև ալիքը դատարկվի, այնուհետև ցիկլը ինքնաբերաբար ավարտվում է:
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 3)
ch <- 10
ch <- 20
close(ch)
// `range` օգտագործում փակված ալիքով
for val := range ch {
fmt.Println(val) // Տպում է 10, հետո 20
}
}