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.