प्रतिनिधि इंटरव्यू विषय

कोडिंग इंटरव्यू: आप Go 1.27 के ड्राफ्ट जेनेरिक मेथड्स का सुरक्षित रूप से मूल्यांकन कैसे करेंगे?

कोडिंगकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक टीम Go 1.27 के ड्राफ्ट रिलीज़ नोट्स में वर्णित जेनेरिक मेथड्स को आज़माना चाहती है। जेनेरिक मेथड्स, जेनेरिक फ़ंक्शन्स और इंटरफ़ेस मेथड्स के बीच की सीमा को स्पष्ट करें, फिर एक ऐसा रिवर्सिबल प्रयोग डिज़ाइन करें जिससे Go 1.26 का पब्लिक API बिल्ड होने योग्य बना रहे।

प्रॉम्प्ट और संदर्भ

एक Go टीम कई मॉड्यूल्स का रखरखाव करती है। इसकी पब्लिक लाइब्रेरी को Go 1.26 के साथ बिल्ड होते रहना चाहिए, जबकि एक प्रायोगिक मॉड्यूल Go 1.27 रिलीज़ नोट्स में वर्णित जेनेरिक मेथड्स का मूल्यांकन करना चाहता है। टीम इंटरफ़ेस कम्पैटिबिलिटी, टूलचेन आवश्यकताओं या रिलीज़ पाइपलाइनों को बदले बिना टाइप-संबंधी जेनेरिक ऑपरेशन्स को एक मेथड नेमस्पेस में रखना चाहती है। भाषा की सीमा, प्रयोग के डिज़ाइन, बिल्ड मैट्रिक्स और निकास (exit) शर्तों को स्पष्ट करें।

Go का पेज स्पष्ट रूप से 1.27 के नोट्स को ड्राफ्ट के रूप में चिह्नित करता है, बताता है कि रिलीज़ अभी उपलब्ध नहीं है, और अगस्त 2026 में रिलीज़ की उम्मीद करता है। यह ऐसे मेथड्स का वर्णन करता है जो अपने स्वयं के टाइप पैरामीटर्स घोषित करते हैं, साथ ही यह भी बताता है कि इंटरफ़ेस मेथड्स टाइप पैरामीटर्स घोषित नहीं कर सकते और जेनेरिक मेथड्स द्वारा लागू नहीं किए जा सकते। इन्हें रिलीज़-पूर्व की सीमाएं (कंस्ट्रेंट्स) मानें, न कि भाषा के स्थिर वादे।

इंटरव्यूअर क्या मूल्यांकन कर रहा है

इंटरव्यूअर यह जांच रहा है कि क्या आप किसी टाइप, फ़ंक्शन और मेथड पर टाइप पैरामीटर्स के बीच अंतर कर सकते हैं, और क्या आप समझते हैं कि दिखने में अधिक जेनेरिक मेथड किसी इंटरफ़ेस को स्वचालित रूप से संतुष्ट नहीं करता है। मजबूत उत्तर एक न्यूनतम प्रयोग, कंपाइलर और go.mod मैट्रिक्स, पब्लिक-API आइसोलेशन, रोलबैक और ड्राफ्ट परिवर्तनों के रिकॉर्ड का प्रस्ताव करते हैं।

पूछने के लिए स्पष्टीकरण संबंधी प्रश्न

  • क्या लक्ष्य कॉलर की अभिव्यंजकता (expressiveness), टाइप इनफेरेंस (type inference), या किसी आंतरिक कार्यान्वयन का पुन: उपयोग है?
  • क्या प्रायोगिक कोड स्थिर मॉड्यूल्स, जेनरेटर, प्लगइन्स या बाहरी उपभोक्ताओं द्वारा इम्पोर्ट किया जा सकता है?
  • पब्लिक API के लिए न्यूनतम Go वर्शन, इंटरफ़ेस सतह और रिलीज़ चक्र क्या है?
  • किन कंपाइलर्स, एनालाइज़र्स, IDEs और CI प्लेटफ़ॉर्म्स को सत्यापित किया जाना चाहिए?
  • यदि ड्राफ्ट का नाम बदला जाता है, वापस लिया जाता है, या इसके सिमेंटिक्स में बदलाव होता है, तो क्या स्थिर मॉड्यूल्स को बदले बिना प्रयोग को हटाया जा सकता है?

30-सेकंड का उत्तर

“मैं Go 1.27 को ड्राफ्ट के रूप में चिह्नित करूँगा और Go 1.26 पब्लिक API को बदले बिना प्रयोग को एक अलग मॉड्यूल और CI जॉब में रखूँगा। एक जेनेरिक मेथड अपने स्वयं के टाइप पैरामीटर्स घोषित कर सकता है, लेकिन इंटरफ़ेस मेथड्स ऐसा नहीं कर सकते, और एक जेनेरिक मेथड इंटरफ़ेस मेथड को लागू नहीं कर सकता; मैं कंक्रीट इंटरफ़ेस और जेनेरिक फ़ंक्शन्स के साथ उन सीमाओं को सत्यापित करूँगा। यह प्रयोग पठनीयता, इनफेरेंस, कंपाइल समय और टूल व्यवहार को मापेगा, न कि स्थिर उपभोक्ताओं के लिए ड्राफ्ट सिंटैक्स प्रकाशित करेगा। कंपाइलर, इंटरफ़ेस संतुष्टि, या जनरेट किए गए कोड में कोई भी असंगति दिखने पर प्रयोग बंद कर दिया जाएगा और स्थिर कार्यान्वयन को बनाए रखा जाएगा।”

चरण-दर-चरण विस्तृत उत्तर

1. वर्शन संबंधी तथ्यों और प्रयोग के लक्ष्यों की पुष्टि करें

प्रगतिरत नोट्स को स्पेसिफिकेशन मानने के बजाय आधिकारिक पेज की तिथि, ड्राफ्ट स्थिति और अपेक्षित रिलीज़ को रिकॉर्ड करें। लक्ष्य को मापने योग्य परिकल्पनाओं में बदलें, जैसे कि कम पैकेज-स्तरीय हेल्पर्स, कॉल-साइट पर अधिक स्पष्ट इनफेरेंस, या किसी आंतरिक डेटा संरचना की बेहतर अभिव्यक्ति। “जेनेरिक मेथड्स बेहतर हैं” कोई पास मानदंड नहीं है।

2. तीन टाइप-पैरामीटर सीमाओं को अलग करें

एक टाइप अपने टाइप पैरामीटर्स घोषित कर सकता है, एक फ़ंक्शन ऐसे पैरामीटर्स घोषित कर सकता है जिनका कॉल साइट पर अनुमान लगाया जाता है, और ड्राफ्ट जेनेरिक-मेथड सुविधा एक मेथड को अपने स्वयं के पैरामीटर्स घोषित करने की अनुमति देती है। इंटरफ़ेस मेथड्स अभी भी टाइप पैरामीटर्स घोषित नहीं कर सकते हैं, और कोई इंटरफ़ेस केवल इसलिए जेनेरिक मेथड प्राप्त नहीं कर लेता क्योंकि कोई कंक्रीट टाइप उसे प्रदान करता है। कंपाइल होने वाले और जानबूझकर विफल होने वाले दोनों उदाहरण दिखाएं ताकि विफलता को टूलिंग बग के बजाय भाषा के नियम के रूप में समझा जा सके।

go
type Box[T any] struct {
    value T
}

// Go 1.27 draft syntax; do not publish from a stable Go 1.26 module.
func (b Box[T]) Convert[U any](fn func(T) U) U {
    return fn(b.value)
}

type Converter interface {
    // Interface methods cannot declare their own type parameters.
    Convert(/* generic method is not allowed here */)
}

मेथड सिंटैक्स केवल ड्राफ्ट चर्चा को फ्रेम करने के लिए दिखाया गया है। एक वास्तविक प्रयोग में रिलीज़ किए गए कंपाइलर और उसके रिलीज़ नोट्स का उपयोग होना चाहिए; टिप्पणी (comment) किया गया इंटरफ़ेस कोई कंपाइल करने योग्य पब्लिक API नहीं है।

3. ड्राफ्ट कोड को एक अलग मॉड्यूल में अलग (आइसोलेट) करें

प्रयोग को उसकी अपनी डायरेक्टरी और go.mod में रखें, टूलचेन को पिन करें, और स्थिर मॉड्यूल्स को उस पर निर्भर होने से रोकें। पब्लिक लाइब्रेरी Go 1.26 के साथ बिल्ड होती रहेगी। प्रायोगिक मॉड्यूल ड्राफ्ट कंपाइलर का उपयोग कर सकता है, लेकिन इसके आर्टिफैक्ट्स स्थिर पैकेजों, जनरेटेड टेम्प्लेट्स, या क्रॉस-मॉड्यूल इंटरफ़ेस में प्रवेश नहीं करने चाहिए। प्रयोग को हटाने के लिए केवल एक मॉड्यूल और CI जॉब को डिलीट करने की आवश्यकता होनी चाहिए, उपभोक्ताओं के कोड को दोबारा लिखने की नहीं।

4. कंपाइलर और टूलिंग मैट्रिक्स बनाएं

स्थिर Go 1.26 कंपाइलर, ड्राफ्ट के लिए उपयोग की जाने वाली टूलचेन, go vet, स्टैटिक एनालाइज़र्स, IDE लैंग्वेज सर्वर्स और लक्षित प्लेटफ़ॉर्म्स को कवर करें। इनफेरेंस, डायग्नोस्टिक्स, कंपाइल समय, कैश व्यवहार, क्रॉस-कंपाइलेशन, डॉक्यूमेंटेशन और जेनरेटर्स की जांच करें। एक जेनेरिक मेथड कंपाइल हो सकता है जबकि फ़ॉर्मेटर्स, एनालाइज़र्स या जेनरेटर्स में अभी भी पूर्ण समर्थन का अभाव हो।

5. मान्यताओं के बजाय इंटरफ़ेस और फ़ंक्शन्स का परीक्षण करें

प्रत्येक मामले के लिए, अपेक्षित कंपाइल होने वाले और गैर-कंपाइल होने वाले परिणामों को रिकॉर्ड करें: कंक्रीट मेथड कॉल्स, पैकेज-स्तरीय जेनेरिक फ़ंक्शन्स, इंटरफ़ेस असाइनमेंट, मेथड वैल्यूज़, मेथड एक्सप्रेशन्स और रिफ्लेक्शन। परीक्षणों से यह सिद्ध होना चाहिए कि क्या कॉलर की जटिलता वास्तव में कम होती है। यदि किसी इंटरफ़ेस को अभी भी एडॉप्टर की आवश्यकता है, तो इस सुविधा ने कपलिंग को कम किए बिना केवल सिंटैक्स को स्थानांतरित किया हो सकता है।

6. निकास (exit) और रिलीज़ गेट्स सेट करें

यदि ड्राफ्ट सिमेंटिक्स बदलते हैं, कंपाइलर क्रैश होता है, टूलिंग कोड को प्रोसेस नहीं कर पाती है, कोई पब्लिक API न्यूनतम-वर्शन परिवर्तन को लीक करता है, या बेंचमार्क कोई दोहराने योग्य लाभ नहीं दिखाते हैं, तो रुक जाएं। एक स्थिर कार्यान्वयन, एक फ़ीचर स्विच और तुलना के लिए एक बेसलाइन बनाए रखें। अंतिम रिलीज़ और माइग्रेशन समीक्षा से पहले मुख्य मॉड्यूल के go निर्देश या पब्लिक API को न बदलें। कंपाइलर वर्शन, कमिट हैश और ज्ञात सीमाओं को रिकॉर्ड करें।

उच्च-गुणवत्ता वाला नमूना उत्तर

मैं पहले पुष्टि करूँगा कि Go 1.27 पेज अभी भी ड्राफ्ट है, फिर जेनेरिक-मेथड प्रयोगों को एक अलग मॉड्यूल और CI जॉब में रखूँगा। उत्तर में यह स्पष्ट होना चाहिए कि मेथड्स टाइप पैरामीटर्स घोषित कर सकते हैं, जबकि इंटरफ़ेस मेथड्स ऐसा नहीं कर सकते और उन्हें जेनेरिक मेथड्स द्वारा लागू नहीं किया जा सकता है। मैं कंक्रीट कॉल्स, पैकेज-स्तरीय जेनेरिक फ़ंक्शन्स, इंटरफ़ेस असाइनमेंट, मेथड वैल्यूज़ और टूल्स का परीक्षण करूँगा; स्थिर लाइब्रेरी Go 1.26 के साथ बिल्ड होती रहेगी, और कोई भी ड्राफ्ट सिंटैक्स इसके पब्लिक API, जनरेटेड कोड, या रिलीज़ आर्टिफैक्ट में प्रवेश नहीं कर सकेगा। केवल अंतिम रिलीज़, कंपाइलर और टूल समर्थन, दोहराने योग्य बेंचमार्क और कम्पैटिबिलिटी समीक्षा के बाद ही मैं माइग्रेशन पर चर्चा करूँगा; अन्यथा मैं प्रयोग बंद कर दूँगा और स्थिर कार्यान्वयन को बनाए रखूँगा।

सामान्य गलतियाँ

  • ड्राफ्ट रिलीज़ नोट्स को एक स्थिर स्पेसिफिकेशन मानना → सिमेंटिक्स और सिंटैक्स बदल सकते हैं → स्थिति रिकॉर्ड करें और प्रयोग को अलग रखें।
  • यह मान लेना कि इंटरफ़ेस मेथड्स टाइप पैरामीटर्स घोषित कर सकते हैं → यह प्रलेखित सीमा का उल्लंघन करता है → कंक्रीट इंटरफ़ेस और जेनेरिक फ़ंक्शन्स का अलग-अलग परीक्षण करें।
  • Go 1.26 मॉड्यूल को प्रयोग पर निर्भर बनाना → न्यूनतम टूलचेन आवश्यकता चुपचाप बढ़ जाती है → स्थिर और प्रायोगिक मॉड्यूल्स को एकतरफा अलग (isolated) रखें।
  • केवल कंपाइलर की सफलता की जांच करना → vet, IDEs, जेनरेटर्स, या क्रॉस-कंपाइलेशन विफल हो सकते हैं → एक पूर्ण टूलिंग मैट्रिक्स चलाएं।
  • नए सिंटैक्स के लिए स्थिर कार्यान्वयन को हटा देना → ड्राफ्ट वापस लिए जाने पर रोलबैक का कोई विकल्प नहीं बचता → तुलना के लिए एक कार्यान्वयन, स्विच और एग्ज़िट गेट बनाए रखें।

फॉलो-अप प्रश्न और उत्तर

जेनेरिक मेथड और जेनेरिक फ़ंक्शन के बीच मुख्य अंतर क्या है?

एक जेनेरिक फ़ंक्शन पैकेज-स्तरीय फ़ंक्शन पर टाइप पैरामीटर्स घोषित करता है। एक जेनेरिक मेथड रिसीवर टाइप के मेथड पर अपने स्वयं के टाइप पैरामीटर्स घोषित करता है। मेथड नेमस्पेस कॉल साइट के साथ बेहतर मेल खा सकता है, लेकिन यह इंटरफ़ेस नियमों को स्वचालित रूप से नहीं बदलता है।

इंटरफ़ेस मेथड जेनेरिक मेथड का आसानी से अनुसरण क्यों नहीं कर सकता?

इंटरफ़ेस संतुष्टि के लिए एक स्थिर, तुलनीय मेथड सेट की आवश्यकता होती है। आधिकारिक ड्राफ्ट कहता है कि इंटरफ़ेस मेथड्स टाइप पैरामीटर्स घोषित नहीं कर सकते और उन्हें जेनेरिक मेथड्स द्वारा लागू नहीं किया जा सकता है, इसलिए इस सीमा के लिए कंक्रीट मेथड्स, एडेप्टर, या पैकेज-स्तरीय जेनेरिक फ़ंक्शन्स का उपयोग किया जाना चाहिए।

आप कैसे साबित करेंगे कि प्रयोग स्थिर मॉड्यूल्स में लीक नहीं हुआ?

Go 1.26 मॉड्यूल को स्वतंत्र रूप से बिल्ड करें, इसके डिपेंडेंसी ग्राफ़, जनरेटेड पैकेजों और रिलीज़ आर्टिफैक्ट्स का निरीक्षण करें, CI में प्रयोग पाथ के इम्पोर्ट्स को प्रतिबंधित करें, और पब्लिक सिम्बल्स तथा वर्शन निर्देशों का ऑडिट करें।

क्या केवल कंपाइलर की सफलता पर्याप्त है?

नहीं। gofmt, vet, एनालाइज़र्स, IDE समर्थन, जेनरेटर्स, क्रॉस-कंपाइलेशन, डॉक्यूमेंटेशन और बेंचमार्क सत्यापित करें क्योंकि बाकी टूलचेन तैयार होने से पहले ही कंपाइलर में ड्राफ्ट आ सकता है।

प्रोडक्शन प्रोजेक्ट कब माइग्रेट हो सकता है?

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

सार्वजनिक स्रोत

संबंधित प्रश्न

संबंधित इंटरव्यू टूल

कोडिंग प्रॉम्प्ट के लिए स्क्रीनशॉट का उपयोग करें

समस्या को कैप्चर करें, फिर क्रम से प्रतिबंधों (constraints), समाधान, कोड, एज केस और जटिलता पर काम करें।

टूल देखें