क्या Go में foreach है? उदाहरणों के साथ चरण-दर-चरण ट्यूटोरियल
\n\nयदि आप Python, JavaScript या PHP से Go में आए हैं, तो आप निश्चित रूप से कलेक्शन को पार करने के लिए संक्षिप्त foreach के आदी हैं। और अब आप Go में अपना पहला लूप लिख रहे हैं और खुद से पूछ रहे हैं: "मेरा पसंदीदा foreach कहाँ है? क्या वास्तव में Go में यह नहीं है?"
स्पॉयलर: Go में वास्तव में कोई सीधा कीवर्ड foreach नहीं है। लेकिन इससे कहीं अधिक लचीली और शक्तिशाली चीज़ है — for range संरचना। इस ट्यूटोरियल में, हम समझेंगे कि Go में इटरेशन कैसे काम करता है, वास्तविक कोड उदाहरण दिखाएंगे और अन्य भाषाओं के परिचित foreach से तुलना करेंगे।
Go में foreach क्यों नहीं है और range की आवश्यकता क्यों है?
\n\nGo एक न्यूनतम भाषा है। इसके निर्माताओं ने जानबूझकर वाक्यात्मक संरचनाओं के दोहराव से परहेज किया। एक अलग कीवर्ड foreach जोड़ने के बजाय, उन्होंने मौजूदा for लूप की क्षमताओं का विस्तार किया। इस प्रकार for range अस्तित्व में आया — ऐरे, स्लाइस, मैप, स्ट्रिंग और यहां तक कि चैनल को पार करने के लिए एक सार्वभौमिक उपकरण।
यदि आप Go में foreach का सटीक एनालॉग ढूंढ रहे हैं, तो यह रहा — for range।
for range का सिंटैक्स: सरल भाषा में समझाया गया
\n\nमूल संरचना इस प्रकार दिखती है:
\n\nfor index, value := range collection {\n // लूप का मुख्य भाग\n}\n\nजहाँ:
\n- \n
index— तत्व का इंडेक्स (ऐरे और स्लाइस के लिए) या कुंजी (मैप के लिए)। \n value— तत्व के मान की प्रतिलिपि। \n collection— आपका कलेक्शन (स्लाइस, ऐरे, मैप, स्ट्रिंग या चैनल)। \n
एक महत्वपूर्ण बिंदु: value हमेशा तत्व की प्रतिलिपि होती है। यदि आप लूप के अंदर value बदलते हैं, तो मूल तत्व नहीं बदलेगा। मूल को बदलने के लिए, आपको इंडेक्स के माध्यम से एक्सेस करना होगा।
उदाहरण 1: स्लाइस को पार करना — Go में foreach का एनालॉग
\n\nआइए सबसे सामान्य मामले से शुरू करें — स्लाइस के तत्वों को पार करना:
\n\npackage main\n\nimport "fmt"\n\nfunc main() {\n fruits := []string{"सेब", "केला", "चेरी", "खरबूजा"}\n\n fmt.Println("स्लाइस को पार करना (foreach का एनालॉग):")\n for index, fruit := range fruits {\n fmt.Printf("इंडेक्स %d: %s\\n", index, fruit)\n }\n}\n\nआउटपुट:
\nस्लाइस को पार करना (foreach का एनालॉग):\nइंडेक्स 0: सेब\nइंडेक्स 1: केला\nइंडेक्स 2: चेरी\nइंडेक्स 3: खरबूजा\n\nयदि आपको केवल इंडेक्स चाहिए (उदाहरण के लिए, तत्वों को बदलने के लिए), तो आप मान को छोड़ सकते हैं:
\n\nfor i := range fruits {\n fruits[i] = "फल: " + fruits[i]\n}\n\nऔर यदि आपको केवल मान चाहिए — तो अंडरस्कोर _ का उपयोग करें:
for _, fruit := range fruits {\n fmt.Println(fruit)\n}\n\nउदाहरण 2: मैप को पार करना — क्लासिक foreach
\n\nGo में मैप को पार करने का for range से अधिक सुरुचिपूर्ण कोई तरीका नहीं है:
package main\n\nimport "fmt"\n\nfunc main() {\n ages := map[string]int{\n "अन्ना": 25,\n "बोरिस": 30,\n "विक्टर": 35,\n }\n\n fmt.Println("मैप को पार करना (foreach):")\n for name, age := range ages {\n fmt.Printf("%s: %d वर्ष\\n", name, age)\n }\n}\n\nGo में मैप को पार करने का क्रम गारंटीड नहीं है। यदि आपको एक स्थिर क्रम चाहिए, तो कुंजियों को एक स्लाइस में इकट्ठा करें और उसे सॉर्ट करें।
\n\nउदाहरण 3: स्ट्रिंग को पार करना — वर्ण-दर-वर्ण इटरेशन
\n\nकई भाषाओं के विपरीत, Go में for range बाइट्स के बजाय रून्स (unicode वर्णों) पर इटरेट करता है:
package main\n\nimport "fmt"\n\nfunc main() {\n text := "नमस्ते, Go!"\n\n fmt.Println("स्ट्रिंग को वर्णों द्वारा पार करना:")\n for i, r := range text {\n fmt.Printf("स्थिति %d: वर्ण '%c' (कोड %U)\\n", i, r, r)\n }\n}\n\nध्यान दें: इंडेक्स i रून के शुरुआती बाइट को इंगित करता है, न कि वर्ण की क्रम संख्या को। एक-बाइट वर्णों वाली स्ट्रिंग के लिए