Sobes.tech
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
	}
}