Go इंटरव्यू: 9 जाल और उनसे कैसे बचें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: Go क्यों और यह इतना कठिन क्यों है?

\n\n

Go (या Golang) एक ऐसी भाषा है जिसे सादगी के लिए पसंद किया जाता है और उसी सादगी के लिए नफरत भी की जाती है। Go इंटरव्यू में शायद ही कभी "बबल सॉर्ट लिखो" पूछा जाता है (हालांकि ऐसा भी हो सकता है)। अक्सर आपसे कंकरेंसी, मेमोरी मैनेजमेंट और साफ, इडियोमैटिक कोड लिखने की समझ पर सवाल पूछे जाएंगे। अगर आप Python या Java के आदी हैं, तो Go आपको बहुत सख्त लग सकता है। लेकिन यही सख्ती इसे प्रोडक्शन सिस्टम के लिए एक आदर्श भाषा बनाती है।

\n\n

इस लेख में, हम उन मुख्य विषयों पर चर्चा करेंगे जो इंटरव्यू में निश्चित रूप से पूछे जाएंगे। आपको सिर्फ थ्योरी नहीं, बल्कि कोड के ठोस उदाहरण और "अंडर द हुड" स्पष्टीकरण मिलेगा। चलिए शुरू करते हैं!

\n\n

1. गोरूटीन और चैनल: बुनियादी बातें जो आपको कंठस्थ होनी चाहिए

\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

चैनल: बिना दर्द के सिंक्रोनाइजेशन

\n

Go में चैनल गोरूटीन के बीच डेटा ट्रांसफर करने के लिए टाइप किए गए "पाइप" हैं। तीन नियम याद रखें:

\n
    \n
  • बंद चैनल में लिखना - पैनिक।
  • \n
  • बंद चैनल से पढ़ना - zero value लौटाता है।
  • \n
  • अनबफर्ड चैनल रिसीवर आने तक गोरूटीन को ब्लॉक करता है।
  • \n
\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\n
select {\ncase msg := <-ch:\n    fmt.Println(msg)\ncase <-time.After(1 * time.Second):\n    fmt.Println("टाइमआउट!")\n}\n
\n\n

2. इंटरफेस: सिर्फ मेथड नहीं, बल्कि कॉन्ट्रैक्ट

\n\n

Go में इंटरफेस इम्प्लिसिटली इम्प्लीमेंट होते हैं। इसका मतलब है कि अगर किसी स्ट्रक्चर में सभी जरूरी मेथड हैं, तो वह ऑटोमैटिकली इंटरफेस को संतुष्ट करता है। अक्सर पूछा जाता है: "interface{} और any में क्या अंतर है?" — जवाब: कुछ नहीं, ये पर्यायवाची हैं (Go 1.18 से)।

\n\n

इंटरव्यू का एक सामान्य टास्क

\n

एक फंक्शन लिखें जो io.Writer ले और उसमें एक स्ट्रिंग लिखे। यह स्टैंडर्ड लाइब्रेरी के इंटरफेस की समझ को परखता है।

\n\n
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 वाले सवाल में न फंसें।

\n\n

3. जेनेरिक्स: नया, लेकिन अब अनिवार्य

\n\n

Go 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\n

constraints पैकेज पर ध्यान दें — इसका उपयोग अक्सर सवालों में होता है। लेकिन याद रखें: Go 1.21 में इसे बिल्ट-इन cmp.Ordered से बदल दिया गया।

\n\n

4. एरर हैंडलिंग: उन्हें इग्नोर न करें

\n\n

Go में try-catch नहीं है। एरर वैल्यू हैं।

ब्लॉग

पुस्तक अनुशंसाएँ