Go में आप for और एक इंडेक्स की मदद से slice पर इटरेशन कर सकते हैं, या range का इस्तेमाल कर सकते हैं।
range की मदद से आप map पर भी इटरेशन कर सकते हैं।
हर इटरेशन दो वैल्यू लौटाता है: इंडेक्स/की, और उस इंडेक्स/की पर मौजूद एलिमेंट की एक प्रति।
स्लाइस पर लूप चलाना बहुत आसान है, और एलिमेंट उसी क्रम में आते हैं जिसकी अपेक्षा की जाती है।
xi := []int{10, 20, 30}
for i, x := range xi {
fmt.Println(i, x)
}
// outputs:
// 0, 10
// 1, 20
// 2, 30
मैप पर इटरेशन करने से एक नई समस्या खड़ी होती है। अब क्रम यादृच्छिक होता है।
hash := map[int]int{9: 10, 99: 20, 999: 30}
for k, v := range hash {
fmt.Println(k, v)
}
// outputs, for example:
// 99 20
// 999 30
// 9 10
ऊपर दिया गया आउटपुट गलत लग सकता है, क्योंकि कोई यह अपेक्षा करेगा कि मैप की घोषणा में सबसे पहला की/वैल्यू जोड़ा 9 10 सबसे पहले प्रिंट हो, सबसे अंत में नहीं।
लेकिन मैप स्वभाव से क्रमरहित होते हैं, यानी इनमें कोई पहला या अंतिम की/वैल्यू जोड़ा नहीं होता।
इसलिए जब आप मैप की एंट्री पर इटरेशन करते हैं, तो जिस क्रम में वे एंट्री देखी जाएँगी वह यादृच्छिक होगा और किसी तय पैटर्न का पालन नहीं करेगा।
इसका मतलब है कि ऊपर दिया गया आउटपुट संभव है, लेकिन जब आप इसे खुद चलाएँगे तो आपको कुछ और मिल सकता है।
इस बारे में और जानने के लिए Go Language Spec: range clause देखिए।
Go में अगर किसी वेरिएबल का इस्तेमाल न किया जाए, तो बिल्ड के समय एरर मिलती है। कभी-कभी आपको सिर्फ वैल्यू की ज़रूरत होती है, जैसा पहले उदाहरण में दिखाया गया है:
xi := []int{10, 20, 30}
for i, x := range xi {
fmt.Println(x)
}
// Go build failed: i declared but not used
आप i की जगह _ लिख सकते हैं, जो कंपाइलर को बताता है कि हम उस वैल्यू का उपयोग नहीं करते:
xi := []int{10, 20, 30}
for _, x := range xi {
fmt.Println(x)
}
// outputs:
// 10
// 20
// 30
अगर आप सिर्फ इंडेक्स प्रिंट करना चाहते हैं, तो आप x की जगह _ लिख सकते हैं, या घोषणा को बिल्कुल छोड़ सकते हैं:
xi := []int{10, 20, 30}
// for i, _ := range xi {
for i := range xi {
fmt.Println(i)
}
// outputs:
// 0
// 1
// 2
टाइप की परिभाषा से एक नया नामित टाइप बनता है, जो हर दूसरे टाइप से अलग होता है। यह अंतर तब भी रहता है जब दोनों का अंतर्निहित टाइप एक ही हो।
type File []bool
यहाँ File शतरंज के बोर्ड के एक खड़े कॉलम को दर्शाता है, जिसे आमतौर पर A से H तक नाम दिया जाता है।
इस कॉलम के हर खाने को एक बूलियन वैल्यू से दर्शाया जाता है, जो बताती है कि वह खाना भरा हुआ है या नहीं।
अब जब File बन चुका है, तो हम इसे दूसरी परिभाषाओं के अंदर भी इस्तेमाल कर सकते हैं:
type Chessboard map[string]File
board := Chessboard{
"A": File{true, false, true},
"B": File{false, true, false},
}
Chessboard फाइल के नामों को File वैल्यू से जोड़ता है।
हर File बूलियन की एक स्लाइस होती है, जो एक शतरंज फाइल के खानों को दर्शाती है।
इन टाइप परिभाषाओं के बिना board का टाइप map[string][]bool होता, जिससे यह समझना मुश्किल हो जाता कि हम किस चीज़ को दर्शा रहे हैं।
शतरंज के शौकीन होने के नाते आप खेल का अपना संस्करण लिखना चाहेंगे। हाँ, ऑनलाइन पहले से शतरंज के बहुत सारे कार्यान्वयन उपलब्ध हो सकते हैं, लेकिन आपका अपना अनोखा होगा!
शतरंज के बोर्ड के हर खाने की पहचान एक अक्षर और संख्या की जोड़ी से होती है:
A B C D E F G H
8 # _ _ _ # _ _ # 8
7 _ _ _ _ _ _ _ _ 7
6 _ _ _ _ # _ _ # 6
5 _ # _ _ _ _ _ # 5
4 _ _ _ _ _ _ # # 4
3 # _ # _ _ _ _ # 3
2 _ _ _ _ _ _ _ # 2
1 # _ _ _ _ _ _ # 1
A B C D E F G H
CountInFile(board Chessboard, file string) int फंक्शन बनाइए।
इसे map पर इटरेशन करके भरे हुए खानों की कुल संख्या गिननी चाहिए।
एक पूर्णांक लौटाइए।
अगर दी गई फाइल map में नहीं मिलती, तो शून्य (0) की गिनती लौटाइए।
CountInFile(board, "A")
// => 3
CountInRank(board Chessboard, rank int) int फंक्शन बनाइए।
इसे दी गई रैंक पर इटरेशन करके भरे हुए खानों की कुल संख्या गिननी चाहिए।
एक पूर्णांक लौटाइए।
अगर दी गई रैंक मान्य नहीं है (1 से 8 के बीच नहीं है, दोनों समेत), तो शून्य (0) की गिनती लौटाइए।
CountInRank(board, 2)
// => 1
CountAll(board Chessboard) int फंक्शन बनाइए।
इसे गिनना चाहिए कि शतरंज के बोर्ड में कितने खाने मौजूद हैं और एक पूर्णांक लौटाना चाहिए।
चूँकि आपको खानों की सामग्री जाँचने की ज़रूरत नहीं है, इसलिए index और value दोनों छोड़कर range इस्तेमाल करने पर विचार कीजिए।
CountAll(board)
// => 64
CountOccupied(board Chessboard) int फंक्शन बनाइए।
इसे गिनना चाहिए कि शतरंज के बोर्ड में कितने खाने भरे हुए हैं।
एक पूर्णांक लौटाइए।
CountOccupied(board)
// => 15
Exercism पर साइन अप कीजिए और Go को 34 कॉन्सेप्ट166 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।