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).
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.
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
$ go run main.go
Kodingizni ishga tushiring