دستور 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 بدون عبارتعبارت بعد از switch را هم میتوان بهکلی حذف کرد.
در این حالت هر case یک عبارت «منطقی» در خود دارد و اولین 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
}
switch هم مانند if میتواند پیش از عبارت، یک دستور کوتاه مقداردهی اولیه داشته باشد.
متغیرهایی که آنجا اعلام میشوند، فقط در محدودهی بلوک 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
fallthroughfallthrough باعث میشود بدنهی case بعدی اجرا شود، صرفنظر از این که عبارت آن مطابقت داشته باشد یا نه.
این دستور باید آخرین دستور در بدنهی case باشد و باید یک case بعدی برای اجرا وجود داشته باشد.
fallthrough در کدی که به سبک متعارف Go نوشته شده چندان رایج نیست، چون 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 را ببینید.