مرکزی مواد پر جائیں
ماڈیول 7 · سبق 2 از 5کورس میں 32/50~15 min
ماڈیول اسباق (2/5)

چینلز: ٹائپ شدہ مواصلات

چینلز درمیان رابطے کے لیے محاوراتی طریقہ کار ہیں۔ گوروٹین گو فلسفہ (روب پائیک):

"میموری شیئر کرکے بات چیت نہ کریں؛ بات چیت کرکے میموری کو شیئر کریں۔"

چینل ایک ٹائپ شدہ FIFO قطار ہے، ٹائپ سیف اور کنکرنٹ کے لیے محفوظ ہے۔ استعمال کریں go کے ساتھ مل کر، یہ Go کا بنیادی بلڈنگ بلاک ہے۔ ہم آہنگی

بنائیں، بھیجیں، وصول کریں۔

Go
ch := make(chan int)     // canale di int, unbuffered

go func() {
    ch <- 42             // invia (può bloccare)
}()

v := <-ch                // ricevi (può bloccare)
fmt.Println(v)           // 42

نحو:

  • بفر کے لیے make(chan T) یا make(chan T, N)۔
  • ch <- v بھیجتا ہے۔
  • v := <-ch وصول کرتا ہے۔
  • v, ok := <-ch ایک جھنڈے کے ساتھ وصول کرتا ہے (ok = false اگر چینل بند اور خالی ہے)۔

unbuffeed: ملاپ

ایک غیر بفر شدہ چینل (صلاحیت 0) بلاکس:

  • بھیجنے والا جب تک وصول کنندہ تیار نہ ہو؛
  • وصول کنندہ جب تک کہ بھیجنے والا تیار نہ ہو۔

یہ ایک ہم وقت ساز ملاقات ہے: "سگنل" یا ضمانت کے طور پر مفید کہ قیمت پہنچا دی گئی ہے۔

بفرڈ: N تک قطار

Go
ch := make(chan int, 3)
ch <- 1   // non blocca
ch <- 2   // non blocca
ch <- 3   // non blocca
ch <- 4   // BLOCCA: il buffer è pieno

بھیجنے والا صرف اس وقت روکتا ہے جب بفر بھرا ہوا ہو۔ صرف وصول کنندہ جب یہ خالی ہے.

قریب اور حد کے لیے

بھیجنے والا چینل کو بند کر دیتا ہے جب مزید اقدار نہ ہوں:

Go
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)

for v := range ch {      // termina quando ch è chiuso E vuoto
    fmt.Println(v)
}

for range ایک چینل پر اس وقت تک دہرایا جاتا ہے جب تک کہ چینل بند نہ ہو جائے (اور خشک ہو جائے)۔ یہ "آنے والی ہر چیز کو استعمال کریں" کا صاف ترین نمونہ ہے۔

دستخطوں میں سمتیت

فنکشن پیرامیٹرز سمت کو محدود کر سکتے ہیں:

Go
func producer(out chan<- int) {   // solo invio
    out <- 1
    close(out)
}

func consumer(in <-chan int) {    // solo ricezione
    for v := range in {
        fmt.Println(v)
    }
}

chan<- T = صرف بھیجنے کے لئے، <-chan T = صرف وصول کرنے کے لئے۔ ایک دو طرفہ چینل chan T کو یا تو (مضمون تبدیلی) کو منتقل کیا جا سکتا ہے۔ یہ وضاحت کو بہتر بناتا ہے اور غلطیوں کو روکتا ہے۔

عام پیٹرن (پیش نظارہ)

  • ورکر پول: N گوروٹینز jobs <-chan T سے استعمال کرتے ہیں، results chan<- R پر پیداوار کرتے ہیں۔
  • پائپ لائن: چینلز کے ذریعے منسلک مراحل۔
  • ڈن سگنل: ایک chan struct{} چینل "روکنے" کے سگنل کے لیے بند ہے۔
Go
done := make(chan struct{})
go func() {
    <-done    // blocca finché qualcuno chiude done
    cleanup()
}()
close(done)   // segnale di stop

chan struct{} "سگنل" چینل ہے: پے لوڈ کے صفر بائٹس، بس ہم وقت سازی

اسے آزمائیں

ورزش#go.m7.l2.e1
کوششیں: 0لوڈ ہو رہا ہے…

ایک غیر بفر شدہ int چینل ch بنائیں، گوروٹین سے 42 بھیجیں، مین میں وصول کریں اور اسے پرنٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

بفر کے بغیر، بھیجنے والا اور وصول کنندہ مطابقت پذیر ہوتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m7.l2.e2
کوششیں: 0لوڈ ہو رہا ہے…

بفر شدہ چینل پر 1,2,3 بھیجیں، اسے بند کریں، پھر ہر چیز کو فار رینج کے ساتھ پرنٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

ایک چینل پر `رینج کے لیے` اس وقت ختم ہو جاتا ہے جب چینل بند ہو اور خشک ہو جائے۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m7.l2.e3
تیار

جب بھیجنے والا بھیجتا ہے لیکن کوئی وصول کنندہ تیار نہیں ہوتا ہے تو UNBUFFERED چینل کیا کرتا ہے؟

Go
ch := make(chan int)
ch <- 1 // ?
جواب کے اختیارات

Recap

  • چینل = ٹائپ شدہ FIFO قطار، گوروٹینز کے درمیان محفوظ۔
  • Unbuffered: ملاپ (بھیجنے والا اور وصول کنندہ مطابقت پذیر)۔
  • بفرڈ: ڈیکپلنگ، صرف مکمل/خالی ہونے پر بلاکس۔
  • close(ch): صرف بھیجنے والا؛ for range بند ہونے تک استعمال کرتا ہے۔
  • سمت بندی: chan<- T (صرف بھیجنے کے لئے)، <-chan T (صرف وصول کرنے کے لئے)۔
  • chan struct{} خالص مطابقت پذیری کے لیے ایک سگنل چینل کے طور پر۔