Switch — bitta qiymatni bir nechta variant bilan ketma-ket solishtirish uchun ishlatiladigan boshqaruv tuzilmasi. Go’ning switchi C++ yoki Java’dan tubdan farq qiladigan bitta muhim xususiyatga ega: u avtomatik “quyiga tushmaydi” (no fallthrough).
switch / case — bitta ifodani bir nechta
casesharti bilan solishtiradigan tuzilma. Go’da moscasetopilgach, boshqacaselarga o’tilmasdanswitchavtomatik tugaydi.
Fallthrough — yo’q, sukut bo’yicha
C++ yoki Java’da har bir casedan keyin break yozish shart, aks holda ijro keyingi casega “sizib o’tadi”. Go’da bu teskarisi — break shart emas, chunki fallthrough sukut bo’yicha o’chirilgan:
package main
import "fmt"
func main() {
son := 2
switch son {
case 1:
fmt.Println("bitta")
case 2:
fmt.Println("ikki")
case 3:
fmt.Println("uch")
}
}
ikki
Faqat mos kelgan case 2: bajarildi, qolganlariga umuman tegilmadi — hech qanday break yozmasdan ham. Bu Go dizaynerlarining ataylab qilgan qarori: C’dagi tasodifiy fallthrough xatolarining oldini olish.
fallthrough kalit so’zi — qo’lda yoqish
Ba’zan keyingi casega ataylab o’tish kerak bo’ladi — bu uchun fallthrough kalit so’zi ishlatiladi:
package main
import "fmt"
func main() {
son := 1
switch son {
case 1:
fmt.Println("bitta")
fallthrough
case 2:
fmt.Println("ikki (fallthrough orqali)")
case 3:
fmt.Println("uch")
}
}
bitta
ikki (fallthrough orqali)
fallthrough — case 1: blokining oxirida yozilgani uchun ijro majburan case 2:ga o’tdi (shartini tekshirmasdan). case 3: esa fallthrough yozilmagani uchun ishga tushmadi.
Shartsiz switch — if…elsif zanjiriga muqobil
switch qiymatsiz, faqat mantiqiy shartlar bilan ham yozilishi mumkin — bu uzun if...else if zanjirini toza ko’rinishga keltiradi:
package main
import "fmt"
func main() {
harorat := 5
switch {
case harorat < 0:
fmt.Println("muzlash")
case harorat < 15:
fmt.Println("sovuq")
case harorat < 25:
fmt.Println("salqin")
default:
fmt.Println("issiq")
}
}
sovuq
switch { — qiymatsiz yozildi, har bir case esa mustaqil bool ifoda. Birinchi rost topilgan case ishladi.
switch bilan init-statement
if kabi, switch ham nuqta-vergulgacha bo’lgan qisqa boshlang’ich buyruqni qabul qiladi:
package main
import "fmt"
func kunNomi(raqam int) string {
switch raqam {
case 1:
return "Dushanba"
case 2:
return "Seshanba"
default:
return "Boshqa"
}
}
func main() {
switch kun := kunNomi(2); kun {
case "Dushanba":
fmt.Println("Hafta boshi")
case "Seshanba":
fmt.Println("Hafta davomi:", kun)
default:
fmt.Println("Noma'lum")
}
}
Hafta davomi: Seshanba
kun := kunNomi(2) avval hisoblandi, so’ng shu natija asosida solishtirildi — kun o’zgaruvchisi esa switch blokining o’zida, caselar ichida ham ishlatilaveradi.