Go में एडवांस इंटरव्यू: गोरूटीन से लेकर जेनेरिक्स तक
\n\nमिड-लेवल या सीनियर Go डेवलपर पद के लिए इंटरव्यू सिर्फ सिंटैक्स की जांच नहीं है। नियोक्ता कंकरेंसी मॉडल, रनटाइम, मेमोरी मैनेजमेंट और टाइपिंग की गहरी समझ की उम्मीद करते हैं। इस लेख में हम Golang के टॉप एडवांस प्रश्नों को कवर करेंगे जो आपको तकनीकी इंटरव्यू में आत्मविश्वास से पास होने में मदद करेंगे। हम बुनियादी बातों जैसे "स्लाइस क्या है" पर नहीं रुकेंगे - सीधे कोड उदाहरणों के साथ जटिल विषयों पर जाएंगे।
\n\n1. गोरूटीन, चैनल और सिंक्रोनाइज़ेशन पैटर्न
\n\nगोरूटीन और चैनल से जुड़े प्रश्न किसी भी इंटरव्यू की क्लासिक हैं। हालांकि, एडवांस लेवल पर आपसे सिर्फ "गोरूटीन क्या है" नहीं पूछा जाएगा, बल्कि शेड्यूलर (GMP-मॉडल) की बारीकियों और सिंक्रोनाइज़ेशन प्रिमिटिव के सही उपयोग के बारे में भी पूछा जाएगा।
\n\nप्रश्न: Go में गोरूटीन शेड्यूलर कैसे काम करता है? G, M, P क्या हैं?
\nGo शेड्यूलर GMP मॉडल का उपयोग करता है: G (goroutine) - हल्का थ्रेड, M (machine) - OS थ्रेड, P (processor) - निष्पादन संदर्भ। P एक लॉजिकल प्रोसेसर से जुड़ा होता है और गोरूटीन की कतार का प्रबंधन करता है। जब कोई गोरूटीन ब्लॉक हो जाती है (जैसे सिस्टम कॉल पर), P M को दूसरी गोरूटीन पर स्विच कर सकता है, जो हजारों OS थ्रेड बनाए बिना कुशल मल्टीटास्किंग सुनिश्चित करता है।
प्रश्न: बफ़र्ड और अनबफ़र्ड चैनल में क्या अंतर है? Deadlock का उदाहरण दें।
\n\n// अनबफ़र्ड चैनल - भेजने वाले को प्राप्त होने तक ब्लॉक करता है\nch := make(chan int)\ngo func() {\n ch <- 42 // ब्लॉक हो जाता है जब तक main न पढ़ ले\n}()\nfmt.Println(<-ch) // 42\n\n// बफ़र्ड चैनल - बफ़र भरने तक ब्लॉक नहीं करता\nchBuf := make(chan int, 2)\nchBuf <- 1\nchBuf <- 2 // ठीक है, बफ़र भरा नहीं\n// chBuf <- 3 // deadlock, अगर कोई पाठक नहीं है\n\n// सामान्य deadlock: खाली अनबफ़र्ड चैनल से पढ़ना\nchDead := make(chan int)\n// <-chDead // fatal error: all goroutines are asleep — deadlock!\n\n\nप्रश्न: चैनल को सुरक्षित रूप से कैसे बंद करें? "range over channel" क्या है?
\nचैनल को केवल भेजने वाले को बंद करना चाहिए। प्राप्तकर्ता जांच के लिए दूसरे पैरामीटर (v, ok := <-ch) का उपयोग कर सकता है। for v := range ch इटरेशन तब समाप्त होगा जब चैनल बंद हो जाएगा। बंद चैनल में लिखने का प्रयास पैनिक का कारण बनता है।
ch := make(chan int)\ngo func() {\n for i := 0; i < 3; i++ {\n ch <- i\n }\n close(ch) // अनिवार्य रूप से बंद करें\n}()\nfor v := range ch {\n fmt.Println(v) // 0, 1, 2\n}\n\n\n2. इंटरफेस, खाली इंटरफेस और type assertions
\n\nGo में इंटरफेस कॉन्ट्रैक्ट हैं। इंटरव्यू में यह समझना महत्वपूर्ण है कि वे आंतरिक रूप से कैसे काम करते हैं (iface और eface संरचना) और स्टैटिक टाइपिंग डायनामिक टाइपिंग से कैसे अलग है।
प्रश्न: खाली इंटरफेस (interface{}) क्या है और इसका उपयोग कब करें?
खाली इंटरफेस में कोई मेथड नहीं होता, इसलिए कोई भी टाइप इसे इम्प्लीमेंट करता है। इसका उपयोग अज्ञात टाइप के डेटा के साथ काम करने के लिए किया जाता है (जैसे json.Unmarshal)। हालांकि, खाली इंटरफेस का अत्यधिक उपयोग Go की सख्त टाइपिंग का उल्लंघन करता है और रनटाइम त्रुटियों का कारण बन सकता है।
प्रश्न: type assertion कैसे काम करता है? type switch से क्या अंतर है?
\n\nvar val interface{} = "hello"\n\n// type assertion\nstr, ok := val.(string)\nif ok {\n fmt.Println("यह एक स्ट्रिंग है:", str)\n}\n\n// type switch\nswitch v := val.(type) {\ncase string:\n fmt.Println("स्ट्रिंग:", v)\ncase int:\n fmt.Println("संख्या:", v)\ndefault:\n fmt.Println("अज्ञात टाइप")\n}\n\n\nप्रश्न: इंटरफेस मेमोरी में कैसे स्टोर होते हैं?
\nप्रत्येक इंटरफेस दो पॉइंटर्स होता है: एक टाइप पर (itable), दूसरा वैल्यू पर (data)। खाली इंटरफेस (interface{}) के लिए, स्टोरेज थोड़ा अलग होता है क्योंकि इसमें कोई मेथड नहीं होता।