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

कोडिंग इंटरव्यू: Go 1.25 hostport विश्लेषण IPv6 एड्रेस निर्माण को कैसे ठीक करता है?

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

प्रश्न

कोड fmt.Sprintf("%s:%d", host, port) के साथ एक net.Dial एड्रेस बनाता है। बताएं कि यह IPv6 के लिए क्यों विफल होता है, इसे net.JoinHostPort के साथ ठीक करें, और IPv4, IPv6, ज़ोन और अमान्य पोर्ट्स के लिए परीक्षण डिज़ाइन करें।

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

एक सर्विस कॉन्फ़िगरेशन से होस्ट और पोर्ट पढ़ती है और fmt.Sprintf("%s:%d", host, port) को net.Dial में पास करती है। IPv4 परीक्षण पास हो जाते हैं, लेकिन प्रोडक्शन में IPv6, लिंक-लोकल एड्रेस और खराब-फ़ॉर्मेट वाले पोर्ट की पार्सिंग की समस्याएं सामने आती हैं। Go 1.25 में कार्यान्वयन को ठीक करें, net.JoinHostPort, SplitHostPort, ज़ोन आइडेंटिफायर्स और इनपुट-सत्यापन सीमाओं की व्याख्या करें, और नए go vet hostport एनालाइज़र पर चर्चा करें। मुख्य कौशल पोर्टेबल नेटवर्क प्रोग्रामिंग है, इसलिए यह एक coding प्रश्न है।

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

पहला, क्या आप पहचानते हैं कि IPv6 टेक्स्ट में कई कोलन होते हैं, जिससे 2001:db8::1:443 जैसा सामान्य संयोजन (concatenation) अस्पष्ट हो जाता है।

दूसरा, क्या आप हाथ से लिखी गई शाखाओं (branches) के बजाय नेटवर्क-एड्रेस सिंटैक्स के अनुसार ब्रैकेट्स जोड़ने के लिए स्टैंडर्ड लाइब्रेरी का उपयोग करते हैं।

तीसरा, क्या आप एक होस्ट स्ट्रिंग, ज़ोन आइडेंटिफायर, पोर्ट स्ट्रिंग और पूर्ण अथॉरिटी के बीच अंतर करते हैं ताकि ब्रैकेट्स और पार्सिंग की पुनरावृत्ति न हो।

चौथा, क्या परीक्षण और एरर IPv4, IPv6, %zone, खाली होस्ट और अमान्य पोर्ट्स को कवर करते हैं।

पांचवां, क्या go vet का उपयोग एक संकेत के रूप में किया जाता है, जबकि कोड समीक्षा और वास्तविक कनेक्शन परीक्षण समाधान को सत्यापित करते हैं।

पहले स्पष्ट करने योग्य प्रश्न

  • क्या host एक सामान्य IP, DNS नाम, ब्रैकेटेड अथॉरिटी, या इनका मिश्रण है?
  • क्या पोर्ट एक पूर्णांक (integer), स्ट्रिंग, या सेवा का नाम है? क्या 0 की अनुमति है?
  • क्या IPv6 लिंक-लोकल एड्रेस और %eth0 जैसे ज़ोन समर्थित होने चाहिए?
  • क्या नेटवर्क TCP, UDP, या एक Unix सॉकेट है?
  • क्या उपयोगकर्ता इनपुट में ब्रैकेट्स और नियंत्रण वर्णों (control characters) को अस्वीकार किया जाना चाहिए?
  • क्या CI एक IPv6 लूपबैक लिसनर को बाइंड कर सकता है?

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

"सामान्य संयोजन (bare concatenation) एक IPv6 होस्ट और उसके पोर्ट के बीच की सीमा को व्यक्त नहीं कर सकता है, इसलिए 2001:db8::1:443 अस्पष्ट है। मैं पोर्ट को सत्यापित करता हूँ, फिर net.JoinHostPort(host, strconv.Itoa(port)) को कॉल करता हूँ; स्टैंडर्ड लाइब्रेरी IPv6 के लिए [host]:port उत्सर्जित करती है और ज़ोन को सुरक्षित रखती है। मैं मैन्युअल रूप से ब्रैकेट्स नहीं जोड़ता। यदि पूर्ण अथॉरिटी स्वीकार की जाती हैं, तो मैं पुनर्निर्माण से पहले उन्हें net.SplitHostPort के साथ पार्स करता हूँ। परीक्षण IPv4, IPv6, %zone, DNS, खाली इनपुट, अमान्य पोर्ट और राउंड-ट्रिप पार्सिंग को कवर करते हैं। Go 1.25 का go vet hostport एनालाइज़र एक स्टैटिक गेट है, नेटवर्क परीक्षणों का विकल्प नहीं।"

विस्तृत समाधान

चरण 1: विफलता की व्याख्या करें

एक IPv4 एड्रेस में होस्ट और पोर्ट को अलग करने वाला एक कोलन होता है; एक IPv6 एड्रेस में स्वयं कोलन होते हैं। इसलिए IPv6 नेटवर्क टेक्स्ट होस्ट को ब्रैकेट्स में रखता है, जैसा कि [2001:db8::1]:443 में है। सामान्य संयोजन कोई सीमा प्रदान नहीं करता है, इसलिए एक पार्सर विश्वसनीय रूप से यह नहीं बता सकता कि क्या अंतिम कोलन पोर्ट सेपरेटर है।

चरण 2: स्टैंडर्ड लाइब्रेरी के साथ निर्माण करें

पोर्ट को स्ट्रिंग में बदलें और net.JoinHostPort को कॉल करें। जब होस्ट में कोलन होता है, तो यह ब्रैकेट्स जोड़ता है; DNS नाम और IPv4 सामान्य रूप में रहते हैं। यह एक ज़ोन आइडेंटिफायर को भी सुरक्षित रखता है, इसलिए इसे कॉल करने से पहले ब्रैकेट्स न जोड़ें या टेक्स्ट को एस्केप न करें।

go
func dialAddress(host string, port int) (string, error) {
  if port < 1 || port > 65535 {
    return "", fmt.Errorf("port out of range: %d", port)
  }
  return net.JoinHostPort(host, strconv.Itoa(port)), nil
}

चरण 3: इनपुट संरचना को परिभाषित करें

API को एक सामान्य होस्ट स्वीकार करना चाहिए, न कि ऐसी अथॉरिटी जिसमें पहले से ही पोर्ट शामिल हो। यदि पूर्ण एड्रेस का समर्थन किया जाना आवश्यक है, तो पहले net.SplitHostPort को कॉल करें, टुकड़ों को सामान्य करें (normalize), और JoinHostPort के साथ पुनर्निर्माण करें। स्ट्रिंग प्रतिस्थापन (replacement) IPv6 और ज़ोन के लिए असुरक्षित है।

चरण 4: ज़ोन आइडेंटिफायर्स को संभालें

एक IPv6 लिंक-लोकल एड्रेस fe80::1%eth0 हो सकता है, जिससे [fe80::1%eth0]:443 बनता है। ज़ोन इंटरफ़ेस स्कोप रखता है और इसे हटाया नहीं जाना चाहिए। इसके अनुमत वर्णों और लंबाई को सत्यापित करें ताकि नियंत्रण वर्ण या अप्रत्याशित अथॉरिटी टेक्स्ट लॉग या डाउनस्ट्रीम कॉन्फ़िगरेशन में प्रवेश न कर सकें।

चरण 5: पूर्ण पते सत्यापित और पार्स करें

निर्माण के बाद, प्रतिवर्तीता (reversibility) की जांच करने और यह सुनिश्चित करने के लिए कि होस्ट और पोर्ट इनपुट से मेल खाते हैं, net.SplitHostPort को कॉल करें। इसके लिए पोर्ट-युक्त नेटवर्क एड्रेस की आवश्यकता होती है; गायब पोर्ट, अतिरिक्त कोलन और बेमेल ब्रैकेट्स को कार्रवाई योग्य एरर वापस करने चाहिए।

चरण 6: go vet hostport को समझें

Go 1.25 में hostport एनालाइज़र जोड़ा गया है, जो net.Dial के लिए एड्रेस बनाने के लिए उपयोग किए जाने वाले fmt.Sprintf("%s:%d", host, port) पैटर्न को फ़्लैग करता है। यह एक सामान्य गलती को पकड़ता है, लेकिन यह कॉन्फ़िगरेशन अनुबंधों, ज़ोन सत्यापन, पोर्ट सीमाओं या वास्तविक नेटवर्क-स्टैक परीक्षणों की जगह नहीं ले सकता।

चरण 7: एक टेस्ट मैट्रिक्स बनाएं

127.0.0.1:443, [2001:db8::1]:443, [fe80::1%eth0]:443, DNS नाम, एक खाली होस्ट, पोर्ट 0, 65536, नकारात्मक मान और पहले से ब्रैकेटेड इनपुट को कवर करें। जहां समर्थित हो, IPv4 और IPv6 लूपबैक लिसनर्स से कनेक्ट करें; अन्यथा शुद्ध निर्माण और विभाजन परीक्षण बनाए रखें और CI क्षमता का दस्तावेजीकरण करें।

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

"दोष एड्रेस सिंटैक्स में है, Dial में नहीं: एक IPv6 होस्ट में कोलन होते हैं, इसलिए सामान्य संयोजन पोर्ट को सीमित नहीं कर सकता है। मैं API को सामान्य होस्ट प्लस पूर्णांक पोर्ट के रूप में परिभाषित करता हूँ, 1..65535 की जांच करता हूँ, और net.JoinHostPort(host, strconv.Itoa(port)) को कॉल करता हूँ; मैं कभी भी हाथ से ब्रैकेट्स नहीं लिखता। यदि एक पूर्ण अथॉरिटी स्वीकार की जाती है, तो मैं पहले इसे विभाजित करता हूँ और सामान्यीकृत होस्ट और पोर्ट से पुनर्निर्माण करता हूँ। मैं लिंक-लोकल एड्रेस के लिए %eth0 को सुरक्षित और सत्यापित करता हूँ। परीक्षण IPv4, IPv6, ज़ोन, DNS, अमान्य पोर्ट और प्रतिवर्ती पार्सिंग को कवर करते हैं। Go 1.25 go vet hostport एक स्टैटिक गेट है, जबकि IPv4/IPv6 लूपबैक कनेक्शन इंटीग्रेशन कवरेज प्रदान करते हैं।"

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

  • fmt.Sprintf("%s:%d", ...) का उपयोग जारी रखना → IPv6 होस्ट और पोर्ट की सीमाएं अस्पष्ट हो जाती हैं → net.JoinHostPort का उपयोग करें।
  • प्रत्येक होस्ट में मैन्युअल रूप से ब्रैकेट जोड़ना → IPv4 और DNS प्रारूप गलत हो जाते हैं → स्टैंडर्ड लाइब्रेरी को निर्णय लेने दें।
  • %zone को हटाना → लिंक-लोकल IPv6 रूट नहीं हो सकता है → ज़ोन को सुरक्षित रखें और सत्यापित करें।
  • एक पूर्ण अथॉरिटी को सामान्य होस्ट के रूप में मानना → पोर्ट या ब्रैकेट्स डुप्लिकेट हो जाते हैं → इनपुट अनुबंध को परिभाषित करें और आवश्यकता पड़ने पर विभाजित करें।
  • केवल IPv4 का परीक्षण करना → प्रोडक्शन विफलता पथ अनकवर रहता है → IPv6, ज़ोन और लूपबैक परीक्षण शामिल करें।
  • केवल go vet पर निर्भर रहना → कस्टम इनपुट और रनटाइम विफलताएं बनी रहती हैं → यूनिट, विभाजन और कनेक्शन परीक्षणों को संयोजित करें।
  • पोर्ट सत्यापन छोड़ना → नकारात्मक या ओवरफ्लोइंग मान कॉन्फ़िगरेशन में प्रवेश करते हैं → निर्माण से पहले सीमा की जांच करें।
  • असत्यापित रॉ पते लॉग करना → नियंत्रण वर्ण या संवेदनशील कॉन्फ़िगरेशन लीक हो सकते हैं → स्ट्रक्चर्ड फ़ील्ड्स को सामान्य करें और लॉग करें।

फॉलो-अप प्रश्न

फॉलो-अप 1: क्या JoinHostPort सत्यापित करता है कि होस्ट एक मान्य IP है?

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

फॉलो-अप 2: केवल अंतिम कोलन का उपयोग क्यों न करें?

IPv6 संपीड़न, ज़ोन और गायब पोर्ट स्ट्रिंग नियमों को नाजुक बना देते हैं। मानक Join/Split जोड़ी एड्रेस सिंटैक्स का पालन करती है और ब्रैकेट या पोर्ट त्रुटियों की स्पष्ट रूप से रिपोर्ट करती है।

फॉलो-अप 3: क्या पोर्ट स्ट्रिंग को सीधे पास किया जा सकता है?

हाँ, JoinHostPort एक स्ट्रिंग पोर्ट स्वीकार करता है। जब व्यावसायिक इनपुट एक पूर्णांक होता है, तो इसकी सीमा को सत्यापित करें और strconv.Itoa के साथ परिवर्तित करें ताकि नकारात्मक या ओवरफ्लोइंग मान एड्रेस में स्वरूपित न हों।

फॉलो-अप 4: ज़ोन को कैसे सैनिटाइज़ किया जाना चाहिए?

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

फॉलो-अप 5: इसके बजाय url.URL का उपयोग कब किया जाना चाहिए?

स्कीम, अथॉरिटी और पाथ के साथ HTTP या HTTPS URI का निर्माण करते समय url.URL का उपयोग करें। net.Dial को पास किए गए host:port के लिए JoinHostPort का उपयोग करें; मैन्युअल रूप से URI को संयोजित न करें।

फॉलो-अप 6: आप कैसे साबित करते हैं कि समाधान वास्तविक IPv6 के साथ काम करता है?

एक IPv6-सक्षम CI या समर्पित वातावरण में, एक [::1]:0 लिसनर को बाइंड करें, इसके निर्दिष्ट पोर्ट को पढ़ें, और उसी कंस्ट्रक्टर के माध्यम से कनेक्ट करें। IPv6 के बिना वातावरण के लिए शुद्ध-फ़ंक्शन परीक्षण बनाए रखें और अंतर का दस्तावेजीकरण करें।

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

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

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

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

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

टूल देखें