एक चर को असाइन करने वाले गोरोइन से वापसी मूल्य प्राप्त करना क्यों संभव नहीं है?
गोरोइन (एसिंक्रोनस रूप से) चलाएं और फ़ंक्शन से वापसी रिटर्न अनिवार्य रूप से विरोधाभासी क्रियाएं हैं। जब आप कहते हैं कि go
आप "इसे अतुल्यकालिक रूप से करते हैं" या यहां तक कि सरल है: "जाओ! फ़ंक्शन के निष्पादन की प्रतीक्षा न करें"। लेकिन जब आप किसी वैरिएबल पर फंक्शन रिटर्न वैल्यू असाइन करते हैं तो आपको वैरिएबल के भीतर यह वैल्यू मिलने की उम्मीद होती है। इसलिए जब आप ऐसा करते हैं कि x := go doSomething(arg)
आप कह रहे हैं: "जाओ, फ़ंक्शन की प्रतीक्षा मत करो! रुको-रुको-रुको! मुझे एक लौटा मूल्य x
अगले पंक्ति में नीचे दाईं ओर सुलभ होना चाहिए !"
चैनल
एक गोरआउट से मूल्य प्राप्त करने का सबसे प्राकृतिक तरीका चैनल है। चैनल वे पाइप हैं जो समवर्ती गोरोइनटाइन को जोड़ते हैं। आप एक गोरोइन से चैनल में मान भेज सकते हैं और उन मूल्यों को दूसरे गोरोइन या एक समकालिक समारोह में प्राप्त कर सकते हैं। आप आसानी से उपयोग नहीं कर एक निर्णायक से एक मूल्य प्राप्त कर सकते हैं select
:
func main() {
c1 := make(chan string)
c2 := make(chan string)
go func() {
time.Sleep(time.Second * 1)
c1 <- "one"
}()
go func() {
time.Sleep(time.Second * 2)
c2 <- "two"
}()
for i := 0; i < 2; i++ {
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
}
}
}
इसका उदाहरण Go By Example से लिया गया है
CSP और संदेश-पासिंग
गो बड़े पैमाने पर सीएसपी सिद्धांत पर आधारित है । ऊपर से अनुभवहीन विवरण को सीएसपी के संदर्भ में सटीक रूप से रेखांकित किया जा सकता है (हालांकि मेरा मानना है कि यह प्रश्न के दायरे से बाहर है)। मैं दृढ़ता से कम से कम सीएसपी सिद्धांत के साथ खुद को परिचित करने की सलाह देता हूं क्योंकि यह आरएडी है। ये छोटे उद्धरण सोच की एक दिशा देते हैं:
जैसा कि इसके नाम से पता चलता है, CSP घटक प्रक्रियाओं के संदर्भ में सिस्टम के विवरण की अनुमति देता है जो स्वतंत्र रूप से काम करते हैं , और संदेश-संचार संचार के माध्यम से पूरी तरह से एक दूसरे के साथ बातचीत करते हैं ।
कंप्यूटर विज्ञान में, संदेश पासिंग एक प्रक्रिया को एक संदेश भेजता है और प्रक्रिया और निर्भर बुनियादी ढांचे का चयन करने और चलाने के लिए वास्तविक कोड का समर्थन करने के लिए निर्भर करता है। संदेश पासिंग पारंपरिक प्रोग्रामिंग से अलग है जहां एक प्रक्रिया, सबरूटीन या फ़ंक्शन को सीधे नाम से आमंत्रित किया जाता है।