Golang में स्लाइस से एलिमेंट कैसे हटाएं: उदाहरणों के साथ पूरी गाइड

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

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

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

Golang में Slice से एलिमेंट कैसे हटाएं: उदाहरणों के साथ विस्तृत गाइड

\n\n

Go में स्लाइस (slices) के साथ काम करना हर डेवलपर की दैनिक दिनचर्या है। लेकिन एक ऑपरेशन अनुभवी "गोफर्स" के लिए भी सवाल खड़े करता है: स्लाइस से एलिमेंट हटाना। लगता है इसमें क्या मुश्किल है? हालांकि, Go में मैप की तरह स्लाइस के लिए कोई बिल्ट-इन delete() मेथड नहीं है। इसलिए हमें खुद ही तरीका निकालना पड़ता है।

\n\n

इस लेख में हम Golang में स्लाइस से एलिमेंट हटाने के सभी तरीकों पर चर्चा करेंगे: इंडेक्स द्वारा सरल हटाने से लेकर क्रम बनाए रखने और मेमोरी ऑप्टिमाइज़ेशन के साथ उन्नत ट्रिक्स तक। आप जानेंगे कि स्लाइस की आंतरिक कार्यप्रणाली कैसे काम करती है, सरल असाइनमेंट हमेशा काम क्यों नहीं करता, और सामान्य गलतियों से कैसे बचें।

\n\n

Go में स्लाइस से हटाने का बिल्ट-इन फंक्शन क्यों नहीं है?

\n\n

कोड में गोता लगाने से पहले, आइए भाषा के दर्शन को समझें। Go में स्लाइस (slice) मूल रूप से बेस ऐरे में एक "विंडो" है। यह डेटा का मालिक नहीं है, बल्कि केवल उन्हें संदर्भित करता है। इसलिए एलिमेंट हटाना मेमोरी से डेटा का भौतिक विलोपन (जैसे C++ में) नहीं है, बल्कि append और slicing की चतुराईपूर्ण संक्रियाओं के साथ "विंडो" का पुनर्निर्माण है।

\n\n

Go आपको खुद तय करने देता है कि हटाने को कैसे व्यवस्थित करना है: क्रम बनाए रखते हुए या बिना, क्षमता घटाकर या बिना घटाए। यह लचीलापन देता है, लेकिन समझ की आवश्यकता होती है।

\n\n

तरीका 1: इंडेक्स द्वारा हटाना (क्रम बनाए रखते हुए)

\n\n

यह सबसे सामान्य मामला है। आपके पास एक स्लाइस है, और आप स्थिति i पर एक एलिमेंट को हटाना चाहते हैं, शेष एलिमेंट के सापेक्ष क्रम को बनाए रखते हुए।

\n\n
package main\n\nimport "fmt"\n\nfunc removeIndex(s []int, index int) []int {\n    // इंडेक्स से पहले के भाग और इंडेक्स के बाद के भाग को जोड़ें\n    return append(s[:index], s[index+1:]...)\n}\n\nfunc main() {\n    slice := []int{1, 2, 3, 4, 5}\n    slice = removeIndex(slice, 2) // इंडेक्स 2 वाला एलिमेंट हटाएं (मान 3)\n    fmt.Println(slice) // [1 2 4 5]\n}\n
\n\n

यह कैसे काम करता है?

\n
    \n
  • s[:index] — हटाए जाने वाले एलिमेंट से पहले के सभी एलिमेंट लें (इसे शामिल न करते हुए)।
  • \n
  • s[index+1:] — हटाए जाने वाले एलिमेंट के बाद के सभी एलिमेंट लें।
  • \n
  • append इन दो "टुकड़ों" को एक स्लाइस में जोड़ता है।
  • \n
\n\n

महत्वपूर्ण: यह तरीका बेस ऐरे को बदलता है। ऑपरेशन के बाद, एलिमेंट 3 भौतिक रूप से मेमोरी में रहेगा (केवल तब ओवरराइट होगा जब आप नए एलिमेंट जोड़ेंगे)। लेकिन आपके लिए यह स्लाइस से "गायब" हो गया है।

\n\n

तरीका 2: इंडेक्स द्वारा हटाना (क्रम बनाए रखे बिना) — तेज़ तरीका

\n\n

यदि एलिमेंट का क्रम महत्वपूर्ण नहीं है (उदाहरण के लिए, आप अक्रमित डेटा सेट के साथ काम कर रहे हैं), तो आप "अंतिम से बदलने" की ट्रिक का उपयोग कर सकते हैं:

\n\n
func removeFast(s []int, index int) []int {\n    // हटाए जाने वाले एलिमेंट को अंतिम एलिमेंट से बदलें\n    s[index] = s[len(s)-1]\n    // स्लाइस को छोटा करें, अंतिम एलिमेंट को हटाते हुए\n    return s[:len(s)-1]\n}\n\nfunc main() {\n    slice := []int{1, 2, 3, 4, 5}\n    slice = removeFast(slice, 1) // इंडेक्स 1 वाला एलिमेंट हटाएं (मान 2)\n    fmt.Println(slice) // [1 5 3 4] — क्रम बदल गया!\n}\n
\n\n

यह तेज़ क्यों है? क्योंकि हम स्लाइस की आधी कॉपी नहीं करते। हम केवल एक एलिमेंट (अंतिम) को हटाए जाने वाले एलिमेंट की जगह ले जाते हैं और स्लाइस को छोटा करते हैं। पहले तरीके की O(n) की तुलना में यह ऑपरेशन O(1) है।

\n\n

कब उपयोग करें: गर्म लूप में, जब प्रदर्शन महत्वपूर्ण हो और क्रम मायने नहीं रखता (उदाहरण के लिए, ऑब्जेक्ट पूल से हटाते समय)।

\n\n

तरीका 3: मान द्वारा हटाना (पहली घटना)

\n\n

अक्सर इंडेक्स के बजाय मान के आधार पर एलिमेंट को ढूंढना और हटाना आवश्यक होता है। इसके लिए पहले इंडेक्स ढूंढें, फिर ऊपर दिए गए किसी एक तरीके का उपयोग करें।

\n\n
func removeByValue(s []string, value string) []string {\n    for i, v := range s {\n        if v == value {\n            return append(s[:i], s[i+1:]...)\n        }\n    }\n    return s // यदि नहीं मिला, तो वापस लौटाएं                

ब्लॉग

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