GoDasturchi
Channels: Communication Between Goroutines

Channels: Communication Between Goroutines

Kanallar: goroutinalar orasidagi muloqot

Umumiy o'zgaruvchi orqali muloqot qilish (Mutex darsidagidek) — bitta yondashuv. Go'ning boshqa, ko'pincha afzalroq yondashuvi bor: "xotirani umumiy holat orqali baham ko'rish o'rniga, muloqot orqali xotirani baham ko'ring". Buning vositasi — kanal (channel).

example.go
ch := make(chan int)   // int qiymatlar uchun kanal
ch <- 42                // yuborish (yozish)
v := <-ch                // qabul qilish (o'qish)

Buferlanmagan kanalda yuborish va qabul qilish bir-birini kutadi: yuboruvchi qabul qiluvchi tayyor bo'lguncha bloklanadi, va aksincha. Kanalni close(ch) bilan yopish mumkin — bu "boshqa qiymat kelmaydi" degan signal. Yopilgan kanal ustidan for v := range ch qilish, barcha yuborilgan qiymatlarni tartib bilan qabul qiladi va kanal yopilgach avtomatik to'xtaydi — xuddi slice yoki map ustidan range qilgandek.

>_ Exercise

SquareChannel(nums []int) []int funksiyasini yozing. Ichida yangi kanal yarating va alohida goroutina ishga tushiring: u nums ustidan aylanib, har bir sonning kvadratini kanalga yuboradi, so'ngra kanalni yopadi (defer close(ch)). Asosiy funksiyada kanal ustidan range qilib, barcha qiymatlarni slice'ga yig'ib qaytaring.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Kanal — goroutinalar orasida qiymat uzatish vositasi. Yuboruvchi tomon ishni tugatgach kanalni close qilishi kerak; qabul qiluvchi tomon esa for v := range ch bilan kanal yopilgunga qadar barcha qiymatlarni tartib bilan oladi.

NEXT UP

Channel Pipelines: Composing Concurrent Stages

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Channels: Communication Between Goroutines

Kanallar: goroutinalar orasidagi muloqot

Umumiy o'zgaruvchi orqali muloqot qilish (Mutex darsidagidek) — bitta yondashuv. Go'ning boshqa, ko'pincha afzalroq yondashuvi bor: "xotirani umumiy holat orqali baham ko'rish o'rniga, muloqot orqali xotirani baham ko'ring". Buning vositasi — kanal (channel).

example.go
ch := make(chan int)   // int qiymatlar uchun kanal
ch <- 42                // yuborish (yozish)
v := <-ch                // qabul qilish (o'qish)

Buferlanmagan kanalda yuborish va qabul qilish bir-birini kutadi: yuboruvchi qabul qiluvchi tayyor bo'lguncha bloklanadi, va aksincha. Kanalni close(ch) bilan yopish mumkin — bu "boshqa qiymat kelmaydi" degan signal. Yopilgan kanal ustidan for v := range ch qilish, barcha yuborilgan qiymatlarni tartib bilan qabul qiladi va kanal yopilgach avtomatik to'xtaydi — xuddi slice yoki map ustidan range qilgandek.

>_ Exercise

SquareChannel(nums []int) []int funksiyasini yozing. Ichida yangi kanal yarating va alohida goroutina ishga tushiring: u nums ustidan aylanib, har bir sonning kvadratini kanalga yuboradi, so'ngra kanalni yopadi (defer close(ch)). Asosiy funksiyada kanal ustidan range qilib, barcha qiymatlarni slice'ga yig'ib qaytaring.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Kanal — goroutinalar orasida qiymat uzatish vositasi. Yuboruvchi tomon ishni tugatgach kanalni close qilishi kerak; qabul qiluvchi tomon esa for v := range ch bilan kanal yopilgunga qadar barcha qiymatlarni tartib bilan oladi.

NEXT UP

Channel Pipelines: Composing Concurrent Stages