[১.৬] কন্ট্রোল ফ্লো স্ট্রাকচার (Control Flow Structure)
[১.৬.১] কন্ডিশনাল স্টেটমেন্ট (Conditional Statement)
কন্ডিশনাল স্টেটমেন্ট বিভিন্ন শর্তের উপর ভিত্তি করে প্রোগ্রাম কোন রাস্তায় যাবে তা নির্ধারণ করতে ব্যবহৃত হয়। বিভিন্ন শর্তের উপর ভিত্তি করে এর রেজাল্ট true অথবা false হয়ে থাকে।
[১.৬.১.১] if,else,else if
শর্তের উপর নির্ভর করে কোন সিদ্ধান্ত নিতে “if, else, else if” ব্যবহার করা হয়। এখানে, কন্ডিশন true হলে একটি কাজ করবে আর false হলে অন্য আরেকটি কাজ করবে।
উদাহরণ –
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
আউটপুট –
7 is odd
else ছাড়াও if ব্যবহার করা যায়।
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
আউটপুট –
8 is divisible by 4
আমরা চাইলে কন্ডিশনের আগে স্টেটমেন্ট ও লিখতে পারি, এই স্টেটমেন্ট ভ্যারিয়েবল পরবর্তী scope এর সকল জায়গায় ব্যবহার করা যাবে।
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
আউটপুট –
9 has 1 digit
[১.৬.১.২] switch
একটা ভ্যালুর উপর নির্ভর করে, অনেকগুলো স্টেটমেন্ট থেকে নির্দিষ্ট একটা স্টেটমেন্ট এক্সিকিউট করার জন্য switch ব্যবহার করা হয়। একই case স্টেটমেন্টে একাধিক এক্সপ্রেশন আলাদা করতে কমা ব্যবহার করা হয়।
সিনট্যাক্স –
switch optstatement; optexpression{
case expression1: Statement..
case expression2: Statement..
...
default: Statement..
}
উদাহরণ –
package main
import "fmt"
func main() {
day := "Friday"
switch day {
case "Monday":
fmt.Println("It's Monday, the start of the week!")
case "Tuesday":
fmt.Println("It's Tuesday, still a long way to go!")
case "Wednesday":
fmt.Println("It's Wednesday, middle of the week!")
case "Thursday":
fmt.Println("It's Thursday, almost there!")
case "Friday":
fmt.Println("It's Friday, the end of the week!")
default:
fmt.Println("It's the weekend!")
}
}
আউটপুট-
It's Friday, the end of the week!
[১.৬.২] Loops
লুপ যেকোনো প্রোগ্রামিং ল্যাংগুয়েজের একটি মৌলিক বিষয় । যখন এক বা একাধিক অপারেশন, ভিন্ন বা একই ভ্যালু ব্যবহার করে বার বার রান করার প্রয়োজন পড়ে অথবা অ্যারে, স্লাইস, ম্যাপের মত কালেকশনগুলোর ভ্যালু নিয়ে কাজ করা হয়, তখন লুপ ব্যবহৃত হয়। প্রত্যেকবার লুপ ঘুরে আসার পর লুপের ভেতরের অপারেশন আবার রান করার পূর্বে কিছু শর্তের সম্মুখীন হতে হয়। এই শর্তের মধ্যে থেকে থাকলে, লুপটি আবার চলে এবং না থাকলে লুপ থেকে বেড় হয়ে যেয়ে পরের কোড এক্সিকিউট করা শুরু হয়।
Go-তে, বহুল ব্যবহৃত লুপ স্টেটমেন্ট ও Iterator কি-ওয়ার্ড হচ্ছে –
- for
- range
[১.৬.২.১] for স্টেটমেন্ট
সবথেকে বেশী ব্যবহৃত লুপ স্টেটমেন্ট হচ্ছে “for”. একে আমরা বিভিন্ন রূপে ব্যবহার করতে পারি –
- While লুপের মত –
i := 1
for i <= 3 {
fmt.Println(i)
i = i + 1
}
এক্ষেত্রে আমরা শুধু শর্তের উপস্থিতি দেখতে পাচ্ছি। যতক্ষণ না এই শর্তের বাইরে যাচ্ছে, এই লুপ চলতেই থাকবে।
আউটপুট –
1
2
3
- ক্লাসিক/বেসিক লুপের জন্য –
for j := 7; j <= 9; j++ {
fmt.Println(j)
}
এই ক্ষেত্রে j := 7 কে বলা হয় initialization, যেটা লুপ শুরু হওয়ার পূর্বেই এক্সিকিউট হয়ে যাবে। এরপর, j <= 9 হলো কন্ডিশন বা শর্ত, লুপ এই শর্ত পূরণের লক্ষ্যেই চলবে। এটি একটি Boolean এক্সপ্রেশন, যা প্রত্যেকবার লুপ ঘুরে আসার পর চেক হবে এবং true হলে লুপ চলমান থাকবে। সবশেষে, j++ হলো increment, যেটা প্রত্যকবার লুপ চলা শেষে এক্সিকিউট হবে।
আউটপুটঃ
7
8
9
- অসীম লুপ –
for {
fmt.Println("loop")
break
}
কোনো শর্ত ছাড়াই এই লুপ গঠিত এবং লুপের অভ্যন্তরীণ কোনো হস্তক্ষেপ ছাড়া এই লুপ থেকে বের হওয়া যাবে না। এক্ষেত্রে আমরা break ব্যবহার করে এই লুপ থেকে বের হয়েছি।
আউটপুট –
loop
[১.৬.২.২] range
range বিভিন্ন কালেকশনের এলিমেন্টগুলো ক্রমানুসারে অ্যাক্সেস করতে সাহায্য করে। এটা অনেকটা বেসিক for লুপের মত। কিন্তু পার্থক্য এই যে, সাধারণ for লুপ সবক্ষেত্রেই ব্যবহার করা যায়, যেখানে range শুধু অ্যারে, স্লাইস, ম্যাপ বা চ্যানেলের মত কালেকশনের ক্ষেত্রে ব্যবহৃত হয়।
নিচের উদাহরণে আমরা একটি স্লাইসের ভেতরে থাকা সংখ্যাগুলো sum ভ্যারিয়েবলে যোগ করার জন্য range ব্যবহার করেছি –
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
আউটপুট –
sum: 9
অ্যারে এবং স্লাইসের ক্ষেত্রে range প্রত্যেক ধাপে ইনডেক্স এবং ভ্যালু উভয়ই প্রদান করে। উপরে আমাদের ইনডেক্সের প্রয়োজন ছিল না, তাই আমরা এটিকে Blank Identifier(_) দিয়ে উপেক্ষা করেছি।
আমরা যদি ইনডেক্সও ব্যবহার করতে চাই –
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
আউটপুট –
index: 1
map-এর ক্ষেত্রে range ব্যবহার করলে key এবং value পাওয়া যায় –
kvs := map[string]string{"a": "apple", "b": "banana"}
for key, value := range kvs {
fmt.Printf("%s -> %s\n", key, value)
}
আউটপুট –
a -> apple
b -> banana
কিন্তু আমরা চাইলে শুধু key টাও ব্যবহার করতে পারি –
for key := range kvs {
fmt.Println("key:", key)
}
আউটপুট –
key: a
key: b