Go में खाली स्ट्रिंग चेक करने का सबसे अच्छा तरीका और अंदरूनी काम

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

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

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

परिचय: वह सवाल जो हर Go डेवलपर को परेशान करता है

\n

अगर आपने कभी Go में कोड लिखा है, तो आपने शायद एक साधारण सी समस्या का सामना किया होगा: यह जांचना कि स्ट्रिंग खाली है या नहीं। यह आसान लगता है, है ना? लेकिन जैसा कि Stack Overflow पर सबसे लोकप्रिय सवाल (हजारों व्यूज!) दिखाता है, इस साधारण ऑपरेशन में भी कई बारीकियाँ हैं।

\n

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

\n

तैयार हैं? चलिए शुरू करते हैं! 🚀

\n\n

Go में स्ट्रिंग क्या है? अंदर झाँकते हैं

\n

खालीपन जांचने के बारे में बात करने से पहले, आइए समझें कि Go में स्ट्रिंग वास्तव में क्या है। कई अन्य भाषाओं के विपरीत, Go में स्ट्रिंग बाइट्स का अपरिवर्तनीय (immutable) क्रम है। लेकिन सबसे दिलचस्प बात यह है कि यह मेमोरी में कैसे स्टोर होती है।

\n\n

String Header: वह संरचना जो आप नहीं देखते

\n

Go आंतरिक रूप से स्ट्रिंग को एक छोटी डेटा संरचना के रूप में प्रस्तुत करता है, जिसे string header कहा जाता है। कोड में यह इस तरह दिखता है:

\n
type StringHeader struct {\n    Data uintptr  // बाइट्स की सरणी का पॉइंटर\n    Len  int      // बाइट्स में स्ट्रिंग की लंबाई\n}
\n

इसका मतलब है कि कोई भी स्ट्रिंग, चाहे खाली हो, 16 बाइट (64-बिट सिस्टम पर) लेती है - पॉइंटर के लिए 8 बाइट और लंबाई के लिए 8 बाइट। महत्वपूर्ण: खाली स्ट्रिंग nil नहीं है! यह एक पूर्ण ऑब्जेक्ट है जिसमें एक पॉइंटर (आमतौर पर एक विशेष खाली मेमोरी ब्लॉक पर) और शून्य के बराबर लंबाई होती है।

\n\n

यह जांच को कैसे प्रभावित करता है?

\n

यह जानकर, हम समझ सकते हैं कि विभिन्न जांच विधियाँ कैसे काम करती हैं। जब आप s == "" लिखते हैं, तो Go कंपाइलर हर बाइट की तुलना नहीं करता। वह वही करता है जिसे "हेडर की तुलना" कहा जाता है। वह दो फील्ड की तुलना करता है: लंबाई और पॉइंटर। यदि दोनों फील्ड मेल खाते हैं, तो स्ट्रिंग्स को बराबर माना जाता है। खाली स्ट्रिंग के लिए, इसका मतलब Len = 0 और Data = &emptyStringData की तुलना करना है।

\n

अब len(s) == 0 देखते हैं। स्ट्रिंग के लिए len() फंक्शन कोई फंक्शन कॉल नहीं है, बल्कि एक बिल्ट-इन ऑपरेशन है। Go कंपाइलर सीधे स्ट्रिंग हेडर से Len फील्ड पढ़ता है। यह प्रोसेसर का एक निर्देश है: MOV (मान को स्थानांतरित करना)।

\n\n

जांच के तीन तरीके: मिथक और वास्तविकता

\n

Stack Overflow पर आपको तीन मुख्य दृष्टिकोण मिलेंगे। आइए प्रदर्शन और शैली के दृष्टिकोण से प्रत्येक का विश्लेषण करें।

\n\n

1. len(s) == 0 — "क्लासिक" तरीका

\n

कैसे काम करता है: स्ट्रिंग हेडर से Len फील्ड लेता है और इसकी तुलना शून्य से करता है।

\n

फायदे:

\n
    \n
  • सबसे अधिक प्रदर्शन। यह सचमुच प्रोसेसर के एक-दो निर्देश हैं। कोई फंक्शन कॉल नहीं, कोई बाइट तुलना नहीं।
  • \n
  • Go के लिए मुहावरेदार (idiomatic)। Go समुदाय इस विधि को इसकी सादगी और दक्षता के लिए पसंद करता है। आप इसे अक्सर मानक लाइब्रेरी में देखेंगे।
  • \n
  • स्पष्ट। "अगर स्ट्रिंग की लंबाई शून्य है, तो स्ट्रिंग खाली है" — तार्किक और सहज।
  • \n
\n

नुकसान: शुरुआती लोगों के लिए s == "" की तुलना में व्यक्तिपरक रूप से कम पठनीय लग सकता है।

\n\n

2. s == "" — "प्राकृतिक" तरीका

\n

कैसे काम करता है: दो स्ट्रिंग हेडर की तुलना करता है। खाली स्ट्रिंग के लिए, यह Len = 0 और Data = &emptyStringData की तुलना है।

\n

फायदे:

\n
    \n
  • शुरुआती लोगों के लिए सहज रूप से समझ में आता है। यह वही है जो आप Python, JavaScript, Java में लिखते हैं। "अगर स्ट्रिंग खाली के बराबर है
  • \n

ब्लॉग

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