একটি switch স্টেটমেন্ট একটি এক্সপ্রেশন মূল্যায়ন করে এবং তার মানের সাথে মেলে এমন প্রথম case-টি রান করে।
লম্বা if ... else if চেইনের চেয়ে এটি প্রায়শই পরিচ্ছন্ন একটি বিকল্প।
operatingSystem := "windows"
switch operatingSystem {
case "windows":
// do something if the operating system is windows
case "linux":
// do something if the operating system is linux
case "macos":
// do something if the operating system is macos
default:
// do something if the operating system is none of the above
}
কমা দিয়ে একাধিক মানকে একটি case-এর মধ্যে রাখা যায়।
এক্সপ্রেশনটি এদের যেকোনো একটির সমান হলে সেই case মিলে যায়:
switch operatingSystem {
case "windows", "linux":
// do something if the operating system is windows or linux
case "macos":
// do something if the operating system is macos
default:
// do something if the operating system is none of the above
}
switch-এর পরের এক্সপ্রেশনটি সম্পূর্ণ বাদও দেওয়া যায়।
তখন প্রতিটি case-এ একটি বুলিয়ান এক্সপ্রেশন থাকে, এবং যেটির মান প্রথমে true হয় সেটিই রান করে।
age := 21
switch {
case age > 20 && age < 30:
// do something if age is between 20 and 30
case age == 10:
// do something if age is equal to 10
default:
// do something else for every other case
}
if-এর মতোই একটি switch-এ এক্সপ্রেশনের আগে একটি ছোট ইনিশিয়ালাইজেশন স্টেটমেন্ট থাকতে পারে।
সেখানে ঘোষিত ভ্যারিয়েবলগুলো শুধু switch ব্লকের মধ্যেই সীমাবদ্ধ থাকে:
switch v := getValue(); {
case v < 0:
// do something if v is less than 0
case v == 0:
// do something if v is 0
default:
// do something else for every other case
}
// v will not be accessible here
fallthrough পরের case-এর বডি রান করায়, তার এক্সপ্রেশনটি মিলত কি না তা নির্বিশেষে।
এটি অবশ্যই case-এর বডির শেষ স্টেটমেন্ট হতে হবে, আর রান করার জন্য একটি পরবর্তী case থাকতে হবে।
ইডিওম্যাটিক Go-তে fallthrough কম দেখা যায়, কারণ এটি পাশাপাশি থাকা case-গুলোকে একে অপরের উপর নির্ভরশীল করে তোলে।
ফলে case-গুলোকে আলাদা আলাদা করে ভেবে দেখা কঠিন হয়ে পড়ে, আর switch-টি পড়তেও কষ্ট হয়।
কয়েকটি case-এর আচরণ একই হওয়া উচিত হলে, কমা দিয়ে সেগুলো একত্র করাই বেশি স্পষ্ট।
আর অন্য কোনো কারণে যদি একাধিক case-এ একই লজিক শেয়ার করা হয়, তবে সেই সাধারণ লজিকটি একটি হেল্পার ফাংশনে সরিয়ে আনার কথা ভাবুন।
s := "hello"
switch s {
case "hello":
fmt.Println("hello")
fallthrough
case "world":
fmt.Println("world") // also runs, even though s != "world"
}
// Output:
// hello
// world
আরও জানতে Go by Example: Switch দেখুন, বা Go ভাষার স্পেসিফিকেশন দেখুন।