Go का जादू: string → []byte — स्ट्रिंग को बाइट ऐरे में बदलने के 3 तरीके

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

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

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

परिचय: "How to assign string to bytes array" प्रश्न इतना लोकप्रिय क्यों है?

\n\n

यदि आपने कभी Go (Golang) में प्रोग्रामिंग की है और एक सामान्य स्ट्रिंग को बाइट ऐरे ([]byte) में बदलने की आवश्यकता का सामना किया है, तो आप अकेले नहीं हैं। Stack Overflow पर "How to assign string to bytes array" प्रश्न को हजारों बार देखा जा चुका है। यह आसान लगता है, है ना? बस लेकर असाइन कर दिया। लेकिन Go एक सख्त टाइपिंग वाली भाषा है, और आप आसानी से किसी स्ट्रिंग को बाइट स्लाइस में असाइन नहीं कर सकते। सही तकनीकों को जानना आवश्यक है।

\n\n

इस लेख में हम Go में string को bytes array में बदलने पर चर्चा करेंगे। मैं आपको तीन मुख्य दृष्टिकोण दिखाऊंगा: सबसे सरल से लेकर सुपर-फास्ट लेकिन खतरनाक तक। आप जानेंगे कि कार्य के अनुसार कौन सी विधि चुननी है, और इन रूपांतरणों में कभी भ्रमित नहीं होंगे।

\n\n

चलिए शुरू करते हैं!

\n\n

थोड़ा सिद्धांत: स्ट्रिंग बाइट ऐरे क्यों नहीं है?

\n\n

कोड में कूदने से पहले, आइए समझें कि Go इन दो प्रकारों में अंतर क्यों करता है। यह ज्ञान आपको दर्जनों बगों से बचाएगा।

\n\n
    \n
  • string Go में बाइट्स का एक अपरिवर्तनीय (immutable) अनुक्रम है। आप इंडेक्स द्वारा स्ट्रिंग के किसी वर्ण को नहीं बदल सकते। स्ट्रिंग हमेशा रीड-ओनली मेमोरी ब्लॉक के रूप में संग्रहीत होती है।
  • \n
  • []byte बाइट्स का एक परिवर्तनीय (mutable) स्लाइस है। आप इसकी सामग्री बदल सकते हैं, नए तत्व जोड़ सकते हैं, आदि।
  • \n
\n\n

यह "अपरिवर्तनीयता" में इस अंतर के कारण ही Go को स्पष्ट रूपांतरण की आवश्यकता होती है। यदि कंपाइलर आपको सीधे स्ट्रिंग को बाइट ऐरे में असाइन करने देता, तो आप गलती से स्ट्रिंग के "संरक्षित" डेटा को बदल सकते थे। इसलिए string को bytes array में असाइन करने के लिए हमेशा आपकी सचेत कार्रवाई की आवश्यकता होती है।

\n\n

दृष्टिकोण #1: स्पष्ट प्रकार रूपांतरण (सबसे सरल)

\n\n

यह पहला तरीका है जो हर शुरुआती के दिमाग में आता है। और यह काम करता है!

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    myString := "Привет, Go!"\n    myBytes := []byte(myString)\n\n    fmt.Println(myBytes) // [208 159 209 128 ...] — UTF-8 में बाइट्स\n    fmt.Println(string(myBytes)) // वापस लाएं: "Привет, Go!"\n}\n
\n\n

लाभ:

\n
    \n
  • अत्यंत सरल और पढ़ने योग्य।
  • \n
  • मानक तरीका, जो किसी भी Go डेवलपर को समझ में आता है।
  • \n
\n\n

नुकसान:

\n
    \n
  • मेमोरी में डेटा की एक नई प्रतिलिपि बनाता है। यदि स्ट्रिंग बहुत बड़ी है (जैसे, 10 MB), तो यह मेमोरी और समय के लिहाज से महंगा हो सकता है।
  • \n
  • उच्च-लोड सिस्टम के लिए उपयुक्त नहीं है जहां हर नैनोसेकंड मायने रखता है।
  • \n
\n\n

कब उपयोग करें: 90% मामलों में। सामान्य अनुप्रयोगों, वेब सेवाओं और स्क्रिप्ट के लिए यह पर्याप्त से अधिक है। जहां आवश्यक न हो, वहां अनुकूलन न करें।

\n\n

दृष्टिकोण #2: copy() का उपयोग (नियंत्रित)

\n\n

कभी-कभी आपके पास पहले से आवंटित बाइट ऐरे होता है, और आप इसे स्ट्रिंग के डेटा से भरना चाहते हैं। यहां copy फ़ंक्शन काम आता है।

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    myString := "Go is awesome"\n    \n    // आवश्यक लंबाई का बाइट स्लाइस बनाएं\n    myBytes := make([]byte, len(myString))\n    \n    // स्ट्रिंग से स्लाइस में डेटा कॉपी करें\n    n := copy(myBytes, myString)\n    \n    fmt.Printf("कॉपी किए गए बाइट्स: %d\\n", n) // 13\n    fmt.Println(string(myBytes)) // "Go is awesome"\n}\n
\n\n

ध्यान दें: copy केवल उतने बाइट्स कॉपी करता है जितने लक्ष्य स्लाइस में समा सकते हैं। यदि लक्ष्य स्लाइस स्ट्रिंग से छोटा है, तो केवल उसकी लंबाई कॉपी होगी। यदि आप आकार के बारे में सुनिश्चित नहीं हैं तो यह स्पष्ट रूपांतरण से अधिक सुरक्षित है।

\n\n

लाभ:

\n
    \n
  • कॉपी प्रक्रिया पर पूर्ण नियंत्रण।
  • \n
  • सुरक्षा: आप ऐरे की सीमा से बाहर नहीं जाएंगे।
  • \n
  • आंशिक कॉपी (substring) के लिए उपयोग किया जा सकता है।
  • \n
\n\n

नुकसान:

\n
    \n
  • पूर्व मेमोरी आवंटन की आवश्यकता है (make)।
  • \n
  • फिर भी डेटा की एक प्रतिलिपि बनाई जाती है।

ब्लॉग

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