Go में साक्षात्कार कैसे पास करें: उन्नत स्तर के शीर्ष प्रश्न
\nGo-डेवलपर पद के लिए साक्षात्कार केवल सिंटैक्स की जाँच नहीं है। उन्नत स्तर पर, साक्षात्कारकर्ता समवर्तीता, मेमोरी प्रबंधन, शेड्यूलर के काम और भाषा के मुहावरों की गहरी समझ देखना चाहते हैं। इस लेख में, हम उन प्रमुख प्रश्नों पर चर्चा करेंगे जो अक्सर सीनियर इंजीनियरों से पूछे जाते हैं, कोड उदाहरणों और स्पष्टीकरणों के साथ। यह सामग्री तैयारी और ज्ञान को व्यवस्थित करने दोनों के लिए उपयोगी होगी।
\n\n1. समवर्तीता: गोरूटीन, चैनल और सिंक्रोनाइज़ेशन प्रिमिटिव
\nGo अपने अंतर्निहित समवर्तीता समर्थन के लिए प्रसिद्ध है। साक्षात्कारकर्ता लगभग हमेशा जाँचते हैं कि उम्मीदवार गोरूटीन और OS थ्रेड के बीच अंतर को कैसे समझता है, और क्या वह चैनल और sync-पैकेज का सही उपयोग करना जानता है।
प्रश्न: गोरूटीन और OS थ्रेड में क्या अंतर है?
\nगोरूटीन एक हल्का थ्रेड है, जो Go शेड्यूलर (G-M-P मॉडल) द्वारा प्रबंधित होता है। इसका अपना स्टैक होता है, जो 2-4 KB से शुरू होता है और गतिशील रूप से बढ़ सकता है। OS थ्रेड एक भारी वस्तु है जिसका स्टैक निश्चित होता है (आमतौर पर 1-8 MB)। एक OS थ्रेड पर हज़ारों गोरूटीन काम कर सकते हैं, जिससे उनका लॉन्च और स्विचिंग बहुत सस्ता हो जाता है।
\n\nप्रश्न: गोरूटीन के साथ काम करते समय डेटा रेस (data race) की स्थिति से कैसे बचें?
\nगोरूटीन के बीच डेटा स्थानांतरित करने के लिए चैनल का उपयोग करें ("Do not communicate by sharing memory; instead, share memory by communicating") या म्यूटेक्स (sync.Mutex, sync.RWMutex) का उपयोग करें। हमेशा -race फ़्लैग के साथ कोड की जाँच करें।
var counter int\nvar mu sync.Mutex\n\nfunc increment() {\n mu.Lock()\n counter++\n mu.Unlock()\n}\n\n\nप्रश्न: select के काम करने के सिद्धांत की व्याख्या करें। यदि सभी चैनल ब्लॉक हो जाएँ तो क्या होगा?
\nselect गोरूटीन को एक साथ कई चैनल ऑपरेशनों की प्रतीक्षा करने की अनुमति देता है। यदि सभी चैनल ब्लॉक हैं, तो select तब तक प्रतीक्षा करेगा जब तक उनमें से एक तैयार न हो जाए। यदि default है, तो वह तुरंत निष्पादित होगा, ब्लॉकिंग को रोकता है।
select {\ncase msg := <-ch1:\n fmt.Println("ch1 से प्राप्त:", msg)\ncase ch2 <- "data":\n fmt.Println("ch2 को भेजा गया")\ndefault:\n fmt.Println("कोई भी चैनल तैयार नहीं है")\n}\n\n\n2. मेमोरी प्रबंधन और कचरा संग्रहकर्ता (GC)
\nउन्नत स्तर के लिए यह समझना महत्वपूर्ण है कि Go में एलोकेशन कैसे काम करता है, वेरिएबल कहाँ रखे जाते हैं (स्टैक/हीप) और कचरा संग्रहकर्ता प्रदर्शन को कैसे प्रभावित करता है।
\n\nप्रश्न: Go कैसे तय करता है कि वेरिएबल को स्टैक पर रखा जाए या हीप में?
\nGo एस्केप एनालिसिस (escape analysis) का उपयोग करता है। यदि कंपाइलर यह साबित कर सकता है कि फ़ंक्शन से लौटने के बाद वेरिएबल का उपयोग नहीं किया जाता है (बाहर "भागता" नहीं है), तो इसे स्टैक पर रखा जाता है। अन्यथा, इसे हीप में रखा जाता है। उदाहरण के लिए, लोकल वेरिएबल पर पॉइंटर लौटाने से वह हीप में "भाग" जाता है।
\nfunc createUser() *User {\n u := User{Name: "Alice"}\n return &u // हीप में भागना\n}\n\n\nप्रश्न: Go में कचरा संग्रहकर्ता कैसे काम करता है? यह किन चरणों से गुज़रता है?
\nGo में GC एक समानांतर, तिरंगा कचरा संग्रहकर्ता (mark-sweep) है। यह तीन चरणों से गुज़रता है:
\n- \n
- Mark Setup (STW): write barrier को चालू करने के लिए दुनिया का एक छोटा स्टॉप। \n
- Marking: समानांतर चरण, जीवित वस्तुओं को चिह्नित करता है। एप्लिकेशन के साथ मिलकर काम करता है। \n
- Sweep: अप्रयुक्त मेमोरी की सफाई, आमतौर पर स्थगित कर दी जाती है। \n
STW (Stop The World) का समय आमतौर पर < 500 µs होता है, जो Go को latency-sensitive अनुप्रयोगों के लिए उपयुक्त बनाता है।
\n\nप्रश्न: GC पर लोड कैसे कम करें?
\n- \n
- बार-बार एलोकेशन से बचें (ऑब्जेक्ट पूल
sync.Poolका उपयोग करें)। \n slice[:0]का उपयोग करके स्लाइस को पुनः उपयोग करें। \n - मान बढ़ाएँ