परिचय: "type converting slices of interfaces" हर Go डेवलपर की समस्या क्यों है
\n\nअगर आपने कभी Go में ऐसा कोड लिखा है जो []interface{} लेता है और उसे []string या []int में बदलने की कोशिश की है, तो आपने शायद यह परेशान करने वाला कंपाइलर मैसेज देखा होगा: cannot convert []interface{} to []string। यह Stack Overflow पर सबसे लोकप्रिय समस्याओं में से एक है, जिसे हज़ारों बार देखा गया है। और यह कोई आश्चर्य की बात नहीं है — पहली नज़र में, लॉजिक कहता है: "अगर हर एलिमेंट एक interface{} है जो एक स्ट्रिंग स्टोर कर रहा है, तो मैं पूरे स्लाइस को एक साथ क्यों नहीं बदल सकता?"
इसका जवाब इस बात में छिपा है कि Go टाइप्स और मेमोरी के साथ कैसे काम करता है। Type converting slices of interfaces सिर्फ टाइप कास्टिंग नहीं है, बल्कि डेटा की पूरी कॉपी करना है। इस आर्टिकल में हम इस समस्या को पूरी तरह से समझेंगे: थ्योरी से शुरू करके, प्रैक्टिकल उदाहरणों से गुज़रते हुए, और रेडी-टू-यूज़ समाधानों तक जिन्हें आप अपने प्रोजेक्ट्स में तुरंत इस्तेमाल कर सकते हैं।
\n\nवैसे, अगर आप Go में लिखते हैं और अनिश्चित डेटा टाइप्स के साथ काम करते हैं — जैसे JSON पार्स करना या बाहरी स्रोतों से डेटा प्रोसेस करना — तो यह टॉपिक आपके लिए बेहद ज़रूरी है। चलिए शुरू करते हैं!
\n\nGo सीधे []interface{} को []T में कन्वर्ट क्यों नहीं करने देता?
\n\nआइए बुनियादी समझ से शुरू करें। Go में interface{} एक खास टाइप है जो एक जोड़ी स्टोर करता है: (टाइप, वैल्यू)। जब आपके पास []interface{} होता है, तो हर एलिमेंट मेमोरी में अलग-अलग बाइट्स लेता है (स्टोर किए गए टाइप पर निर्भर करता है)। जबकि []string — string स्ट्रक्चर की एक सतत अरे है (हर स्ट्रिंग में डेटा का पॉइंटर + लेंथ होती है)।
कल्पना करें कि आपके पास अलग-अलग साइज़ के रंग-बिरंगे गेंदों का एक डिब्बा है (यह []interface{} है), और आपको उन्हें एक ऐसे डिब्बे में रखना है जहाँ सभी गेंदें एक ही रंग और साइज़ की हों ([]string)। डिब्बे को सीधे शिफ्ट नहीं किया जा सकता — हर गेंद को जाँचना, निकालना और नए डिब्बे में रखना होगा। Type converting slices of interfaces में बिल्कुल यही होता है।
मुख्य बात: type assertion (टाइप असर्शन) सिर्फ अलग-अलग एलिमेंट्स पर काम करता है, पूरे स्लाइस पर नहीं। Go मास कन्वर्ज़न के लिए कोई सिंटैक्स शुगर प्रदान नहीं करता — यह जानबूझकर किया गया है ताकि आप स्पष्ट रूप से नियंत्रित कर सकें कि हर एलिमेंट के साथ क्या हो रहा है।
\n\nवह एरर जो आपने शायद देखी होगी
\n\npackage main\n\nimport "fmt"\n\nfunc main() {\n data := []interface{}{"apple", "banana", "cherry"}\n // कंपाइलेशन एरर:\n // cannot use data (variable of type []interface{}) as type []string in assignment\n // var fruits []string = data\n fmt.Println(data)\n}\n\n\nयह कोड कंपाइल नहीं होगा। Go कंपाइलर टाइप्स के मामले में सख्त है, और अलग-अलग टाइप के स्लाइस का इम्प्लिसिट कन्वर्ज़न प्रतिबंधित है। भले ही आपको पूरा यकीन हो कि अंदर सिर्फ स्ट्रिंग्स हैं।
\n\nसही तरीका: हर एलिमेंट के लिए Type Assertion
\n\nType converting slices of interfaces करने का सबसे आसान और समझने योग्य तरीका है — हर एलिमेंट पर लूप चलाकर type assertion (टाइप असर्शन) लगाना।
\n\nType assertion के साथ बेसिक उदाहरण
\n\npackage main\n\nimport "fmt"\n\nfunc convertToStrings(data []interface{}) []string {\n result := make([]string, 0, len(data))\n for _, v := range data {\n // यह चेक करना कि v एक string है या नहीं\n if str, ok := v.(string); ok {\n result = append(result, str)\n } else {\n // एरर हैंडलिंग: एलिमेंट स्ट्रिंग नहीं है\n fmt.Printf("चेतावनी: एलिमेंट %v स्ट्रिंग नहीं है, इसे छोड़ रहे हैं\\n", v)\n }\n }\n return result\n}\n\nfunc main() {\n mixed := []interface{}{"hello", 42, "world", true, "golang"}\n strings := convertToStrings(mixed)\n fmt.Println(strings) /