Junior — Middle
Kanal daxilində massivinin rolu nədir və hansı ssenarilərdə tətbiq olunur?
sobes.tech Süni İntellekt
AI-dan cavab
Go dilində, kanal (channel) — goroutine’lar arasında məlumatların ötürülməsi üçün vasitədir və sinxronizasiya və mesaj mübadiləsini təmin edir. Kanal daxilində, sabit ölçülü bir massiv — buffer — tətbiq edilmişdir və bu buffer, kanaldan ötürülən elementləri saxlayır.
Kanal daxilində massivinin rolu:
- Bufferlama: massiv, başqa bir goroutine onu oxumadan əvvəl, göndəriciyə kanala bir neçə dəyər yazmağa imkan verir.
- Asinxronluq: buffer, göndərici və qəbul edən arasında qismən ayrım yaradır, bu da performansı artırır və bloklamaları azaldır.
Bufferli kanalların istifadə ssenariləri:
- Yük zirvələrini yumşaltmaq üçün, göndəricinin bloklanmamasını təmin etmək, əgər qəbul edən müvəqqəti məşğul olsa.
- Məhdud ölçülü mesaj növbələrinin həyata keçirilməsi üçün.
3 ölçülü bufferli kanal yaratma nümunəsi:
ch := make(chan int, 3) // 3 elementlik buffer ilə kanal
ch <- 1 // bloklanmır, çünki buffer dolu deyil
ch <- 2
ch <- 3
// 4-cü elementi göndərməyə çalışarkən, əgər heç kim oxumursa, göndərici bloklanacaq
// ch <- 4
fmt.Println(<-ch) // kanaldan oxuma, bufferdə yer açır
Əgər kanal buffersizdirsə (ölçüsü 0), daxili massiv mövcud deyil və göndərmə, kimsə dəyəri oxuyana qədər bloklanır.