ট্র্যাক
/
Go
Go
/
সিলেবাস
/
রেঞ্জ ইটারেশন
রে

রেঞ্জ ইটারেশন মধ্যে Go

১টি অনুশীলনী

রেঞ্জ ইটারেশন সম্পর্কে

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
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

রেঞ্জ ইটারেশন শিখুন