मुख्य सामग्री पर जाएं
मॉड्यूल 7 · पाठ 2 का 5पाठ्यक्रम में 32/50~15 min
मॉड्यूल पाठ (2/5)

चैनल: टाइप किया गया संचार

चैनल बीच संचार के लिए मुहावरेदार तंत्र हैं goroutines. गो दर्शन (रॉब पाइक):

"स्मृति साझा करके संवाद न करें; संचार करके स्मृति साझा करें।"

एक चैनल एक टाइप की गई फीफो कतार है, जो टाइप-सुरक्षित और समवर्ती के लिए सुरक्षित है उपयोग करें. 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 यदि चैनल बंद और खाली है)।

असंबद्ध: मिलन स्थल

एक असंबद्ध चैनल (क्षमता 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 को किसी एक (अंतर्निहित रूपांतरण) में पास किया जा सकता है। यह स्पष्टता में सुधार करता है और गलतियों को रोकता है।

सामान्य पैटर्न (पूर्वावलोकन)

  • वर्कर पूल: एन गोरआउट्स 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लोड हो रहा है...

एक अनबफ़र्ड इंट चैनल सीएच बनाएं, गोरोइन से 42 भेजें, मुख्य रूप से प्राप्त करें और इसे प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

बफ़र के बिना, प्रेषक और रिसीवर सिंक्रनाइज़ होते हैं।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m7.l2.e2
प्रयास: 0लोड हो रहा है...

बफ़र्ड चैनल पर 1,2,3 भेजें, इसे बंद करें, फिर फ़ॉर-रेंज के साथ सब कुछ प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

एक चैनल पर `फॉर रेंज` तब समाप्त हो जाती है जब चैनल बंद हो जाता है और सूखा हो जाता है।

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m7.l2.e3
तैयार

जब प्रेषक भेजता है लेकिन कोई प्राप्तकर्ता तैयार नहीं होता तो अनबफ़र्ड चैनल क्या करता है?

Go
ch := make(chan int)
ch <- 1 // ?
उत्तर विकल्प

संक्षिप्त

  • चैनल = टाइप की गई फीफो कतार, गोरआउट्स के बीच सुरक्षित।
  • अनबफ़र्ड: मिलन स्थल (प्रेषक और रिसीवर सिंक्रनाइज़)।
  • बफ़र्ड: डिकॉउलिंग, पूर्ण/खाली होने पर ही ब्लॉक होता है।
  • close(ch): केवल प्रेषक; for range बंद होने तक उपभोग करता है।
  • दिशात्मकता: chan<- T (केवल भेजें), <-chan T (केवल प्राप्त करें)।
  • chan struct{} शुद्ध सिंक्रनाइज़ेशन के लिए एक सिग्नल चैनल के रूप में।