परिचय: Go क्यों और यह इतना कठिन क्यों है?
\n\nGo (या Golang) एक ऐसी भाषा है जिसे सादगी के लिए पसंद किया जाता है और उसी सादगी के लिए नफरत भी की जाती है। Go इंटरव्यू में शायद ही कभी "बबल सॉर्ट लिखो" पूछा जाता है (हालांकि ऐसा भी हो सकता है)। अक्सर आपसे कंकरेंसी, मेमोरी मैनेजमेंट और साफ, इडियोमैटिक कोड लिखने की समझ पर सवाल पूछे जाएंगे। अगर आप Python या Java के आदी हैं, तो Go आपको बहुत सख्त लग सकता है। लेकिन यही सख्ती इसे प्रोडक्शन सिस्टम के लिए एक आदर्श भाषा बनाती है।
\n\nइस लेख में, हम उन मुख्य विषयों पर चर्चा करेंगे जो इंटरव्यू में निश्चित रूप से पूछे जाएंगे। आपको सिर्फ थ्योरी नहीं, बल्कि कोड के ठोस उदाहरण और "अंडर द हुड" स्पष्टीकरण मिलेगा। चलिए शुरू करते हैं!
\n\n1. गोरूटीन और चैनल: बुनियादी बातें जो आपको कंठस्थ होनी चाहिए
\n\nगोरूटीन थ्रेड नहीं हैं
\nसबसे आम सवाल: "गोरूटीन OS थ्रेड से कैसे अलग है?" जवाब: गोरूटीन हल्की होती है (स्टैक 2 KB से शुरू), इसे Go शेड्यूलर मैनेज करता है, न कि कर्नेल। दस लाख गोरूटीन चलाना सामान्य है। दस लाख थ्रेड सिस्टम को क्रैश कर देंगे।
\n\n// उदाहरण: 10 गोरूटीन चलाना\nfor i := 0; i < 10; i++ {\n go func(id int) {\n fmt.Printf("गोरूटीन %d काम कर रही है\\n", id)\n }(i)\n}\n// इंतजार (खराब तरीका, सिर्फ उदाहरण के लिए)\ntime.Sleep(time.Second)\n\n\nचैनल: बिना दर्द के सिंक्रोनाइजेशन
\nGo में चैनल गोरूटीन के बीच डेटा ट्रांसफर करने के लिए टाइप किए गए "पाइप" हैं। तीन नियम याद रखें:
\n- \n
- बंद चैनल में लिखना - पैनिक। \n
- बंद चैनल से पढ़ना - zero value लौटाता है। \n
- अनबफर्ड चैनल रिसीवर आने तक गोरूटीन को ब्लॉक करता है। \n
// चैनल के साथ सही काम\nch := make(chan int, 2) // बफर्ड\n\nch <- 1\nch <- 2\nclose(ch)\n\nfor val := range ch {\n fmt.Println(val) // 1, 2\n}\n\n\nइंटरव्यू टिप: अगर "select" के बारे में पूछा जाए, तो टाइमआउट वाला उदाहरण दिखाएं:
\n\nselect {\ncase msg := <-ch:\n fmt.Println(msg)\ncase <-time.After(1 * time.Second):\n fmt.Println("टाइमआउट!")\n}\n\n\n2. इंटरफेस: सिर्फ मेथड नहीं, बल्कि कॉन्ट्रैक्ट
\n\nGo में इंटरफेस इम्प्लिसिटली इम्प्लीमेंट होते हैं। इसका मतलब है कि अगर किसी स्ट्रक्चर में सभी जरूरी मेथड हैं, तो वह ऑटोमैटिकली इंटरफेस को संतुष्ट करता है। अक्सर पूछा जाता है: "interface{} और any में क्या अंतर है?" — जवाब: कुछ नहीं, ये पर्यायवाची हैं (Go 1.18 से)।
इंटरव्यू का एक सामान्य टास्क
\nएक फंक्शन लिखें जो io.Writer ले और उसमें एक स्ट्रिंग लिखे। यह स्टैंडर्ड लाइब्रेरी के इंटरफेस की समझ को परखता है।
func WriteHello(w io.Writer) {\n _, err := w.Write([]byte("Hello, Go!"))\n if err != nil {\n log.Fatal(err)\n }\n}\n\n// उपयोग:\nvar buf bytes.Buffer\nWriteHello(&buf)\nfmt.Println(buf.String()) // Hello, Go!\n\n\nजाल: Go में सभी इंटरफेस दो पॉइंटर्स (टाइप + वैल्यू) होते हैं। खाली इंटरफेस (interface{}) nil के बराबर नहीं होता, अगर उसमें (*int)(nil) है। इसे याद रखें ताकि nil != nil वाले सवाल में न फंसें।
3. जेनेरिक्स: नया, लेकिन अब अनिवार्य
\n\nGo 1.18 के साथ जेनेरिक्स भाषा का हिस्सा बन गए। इंटरव्यू में आपसे एक जेनेरिक फंक्शन लिखने को कहा जा सकता है। उदाहरण के लिए, एक फंक्शन जो किसी भी टाइप का स्लाइस ले और उसकी लंबाई लौटाए (सामान्य) या अधिकतम मान खोजे।
\n\n// मैक्सिमम खोजने के लिए जेनेरिक फंक्शन\nfunc Max[T constraints.Ordered](a, b T) T {\n if a > b {\n return a\n }\n return b\n}\n\n// उपयोग:\nfmt.Println(Max(10, 20)) // 20\nfmt.Println(Max(3.14, 2.71)) // 3.14\n\n\nconstraints पैकेज पर ध्यान दें — इसका उपयोग अक्सर सवालों में होता है। लेकिन याद रखें: Go 1.21 में इसे बिल्ट-इन cmp.Ordered से बदल दिया गया।
4. एरर हैंडलिंग: उन्हें इग्नोर न करें
\n\nGo में try-catch नहीं है। एरर वैल्यू हैं।