Sobes.tech
Middle

Go tilida qanday kanal turlari mavjud? Bufferli va buffersiz kanallar haqida gapir.

sobes.tech AI

AIdan javob

Go tilida kanallar (channels) ikki asosiy turga ega: bufferli va buffersiz.

  • Buffersiz kanallar ichki bufferi bo'lmagan kanallardir. Bunday kanalga yuborish, boshqa gorutina kanalni o'qigunga qadar bloklanadi, va aksincha — o'qish, qiymat paydo bo'lguncha bloklanadi. Bu gorutinalar o'rtasida sinxronizatsiya ta'minlaydi.

  • Bufferli kanallar esa belgilangan o'lchamdagi ichki bufferga ega. Kanalga yuborish, agar buffer to'liq bo'lsa, bloklanadi va buffer bo'sh bo'lsa, o'qish bloklanadi. Bu yuboruvchi va qabul qiluvchi o'rtasida ma'lum bir asinxronlikni ta'minlaydi.

Misol uchun, yaratish va foydalanish:

ch := make(chan int)         // buffersiz kanal
chBuf := make(chan int, 3)   // bufferli kanal, 3 ta element uchun

// Buffersiz kanal sinxronizatsiyani talab qiladi:
ngo func() {
    ch <- 42 // kimdir o'qimaguncha bloklanadi
}()
value := <-ch

// Bufferli kanal 3 ta elementgacha yuborishga ruxsat beradi:
chBuf <- 1
chBuf <- 2
chBuf <- 3
// To'rtinchi elementni yuborishga urinish, o'qilguncha bloklanadi

valueBuf := <-chBuf

Shu sababli, kanal turini tanlash, sinxronizatsiya va ishlash talablariga bog'liq.