Go-তে, for range একটি রেঞ্জ এক্সপ্রেশন থেকে পাওয়া মানগুলোর জন্য একটি কোড ব্লক বারবার পুনরাবৃত্তি করে।
রেঞ্জ এক্সপ্রেশনটিই ঠিক করে দেয় প্রতিটি ইটারেশন একটি মান দেবে নাকি দুটি।
স্লাইসের উপর range ক্রমানুসারে প্রতিটি এলিমেন্টের ইনডেক্স ও মান দেয়:
vals := []int{10, 20, 30}
for i, v := range vals {
fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30
ম্যাপের উপর range প্রতিটি কী (key) ও মান দেয়, তবে ইটারেশনের ক্রম নিশ্চিত নয়।
Go ইচ্ছাকৃতভাবেই ম্যাপের ইটারেশনের ক্রম এলোমেলো করে দেয়, তাই একই প্রোগ্রাম প্রতিবার চালালে ভিন্ন আউটপুট দিতে পারে।
hash := map[int]int{9: 10, 99: 20, 999: 30}
for k, v := range hash {
fmt.Println(k, v)
}
// 99 20
// 999 30
// 9 10
স্ট্রিংয়ের উপর range বাইট ইনডেক্স আর প্রতিটি রুন (ইউনিকোড কোড পয়েন্ট) দেয়।
পরের উদাহরণে, 子 তিনটি বাইট জুড়ে আছে, তাই 猫 শুরু হয় বাইট ইনডেক্স 3-এ, 1-এ নয়।
for i, r := range "子猫" {
fmt.Println(i, r, string(r))
}
// 0 23376 子
// 3 29483 猫
এর বদলে আপনার যদি রুন ইনডেক্স দরকার হয়, তাহলে স্ট্রিংটিকে রুনের স্লাইসে রূপান্তর করুন:
for i, r := range []rune("子猫") {
fmt.Println(i, r, string(r))
}
// 0 23376 子
// 1 29483 猫
range সরাসরি একটি ইন্টিজারের উপরও ইটারেট করতে পারে, যা 0 থেকে শুরু করে ওই ইন্টিজারটি নিজে বাদ দিয়ে তার আগপর্যন্ত মান দেয়।
শূন্য ও ঋণাত্মক মান বৈধ, কিন্তু тогда কোনো ইটারেশন হয় না।
for n := range 3 {
fmt.Println(n)
}
// 0
// 1
// 2
range iter.Seq[V] বা iter.Seq2[K, V] টাইপের একটি ইটারেটর গ্রহণ করে।
ইটারেটর হলো এমন একটি ফাংশন, যা একবারে একটি করে মানের একটি সিকোয়েন্স তৈরি করে।
এরপর range সেই মানগুলোর মধ্য দিয়ে ধাপে ধাপে এগোতে পারে।
text := "The quick brown fox"
for word := range strings.FieldsSeq(text) {
fmt.Println(word)
}
// The
// quick
// brown
// fox
names := []string{"Alice", "Bob", "Vera"}
for i, v := range slices.All(names) {
fmt.Println(i, ":", v)
}
// 0 : Alice
// 1 : Bob
// 2 : Vera
সবশেষে, range একটি চ্যানেল দিয়ে পাঠানো মান গ্রহণ করতে পারে, যতক্ষণ না সেই চ্যানেল অন্য কোথাও বন্ধ করা হয়।
চ্যানেল নিয়ে ট্র্যাকের সিলেবাসে পরে আরও বিশদে আলোচনা করা হয়েছে।
কোনো ভ্যারিয়েবল ডিক্লেয়ার করা হয়েছে কিন্তু কখনও ব্যবহার করা হয়নি, এমন হলে Go কম্পাইল হবে না।
vals := []int{10, 20, 30}
for i, v := range vals {
fmt.Println(v)
}
// Go build failed: declared and not used: i
শুধু মান দরকার হলে, উপেক্ষা করার জন্য ইনডেক্স বা কী (key) _-তে অ্যাসাইন করুন।
vals := []int{10, 20, 30}
for _, v := range vals {
fmt.Println(v)
}
// 10
// 20
// 30
শুধু ইনডেক্স দরকার হলে, সেটি একেবারে বাদ দিন:
vals := []int{10, 20, 30}
for i := range vals {
fmt.Println(i)
}
// 0
// 1
// 2
ইনডেক্স বা মান কোনোটিই দরকার না হলে, দুটোই বাদ দেওয়া যায়:
vals := []int{10, 20, 30}
count := 0
for range vals {
count++
}
// count == 3