switch bir nechta holatdan birini tanlash
switch bir qiymat yoki shartga qarab bir nechta yo'ldan birini tanlaydi. Masalan, hafta kuni raqamidan kun nomini
topish, HTTP status kodini izohlash yoki foydalanuvchi roliga mos amalni bajarish mumkin.
Oldingi darsdagi if va else if ham tanlash uchun ishlatiladi. Biroq bitta qiymatni ko'p variant bilan solishtirganda
switch odatda ixchamroq va o'qilishi osonroq bo'ladi.
Asosiy sintaksis
switch ifoda {
case qiymat1:
// ifoda qiymat1 ga teng bo'lsa bajariladi
case qiymat2:
// ifoda qiymat2 ga teng bo'lsa bajariladi
default:
// hech bir case mos kelmasa bajariladi
}
switch avval ifodani hisoblaydi. So'ng case qiymatlarini yuqoridan pastga solishtiradi. Birinchi mos kelgan case bloki
bajariladi va switch tugaydi. Hech biri mos kelmasa, ixtiyoriy default bloki bajariladi.
Info
Goda har bir case oxiriga break yozish shart emas. Mos blok bajarilgach keyingi casega avtomatik o'tilmaydi. Bu
xususiyat Goni C, Java va JavaScript kabi tillardan ajratib turadi.
Hafta kunini aniqlash
5 kiritilsa:
kun qiymati har bir case bilan solishtiriladi. 5 faqat case 5ga mos keladi. 0 yoki 8
qiymatlar hech bir kunga mos emas, shuning uchun default xato xabarini chiqaradi. Matn kiritilsa, fmt.Scan()
qaytargan xato err o'zgaruvchisiga beriladi, if shart operatori tekshiradi va shu yerda ishni to'xtatadi.
Bitta caseda bir nechta qiymat
Bir nechta qiymatlar uchun bitta vazifani bajarish kerak bo'lsa, qiymatlarni vergul bilan bitta casega yozish mumkin:
| main.go | |
|---|---|
Natija:
Vergul bu yerda yoki ma'nosini beradi. kun qiymati "shanba" yoki "yakshanba" bo'lsa, birinchi blok bajariladi.
Qiymatlar kun bilan taqqoslanadigan turda bo'lishi kerak. Masalan, switch ichida string turi bo'lsa, case 1 ya'ni
boshqa turni yozib bo'lmaydi.
Ifodasiz switch
switchdan keyingi ifodani yozmaslik mumkin. Bunda switch true kabi bo'ladi va har bir case mantiqiy shart bo'ladi:
Natija:
Shartlar yuqoridan pastga tekshiriladi. 28 < 30 birinchi mos shart bo'lgani uchun Iliq chiqadi. Tartib muhim!
harorat < 30ni harorat < 20dan oldin yozsak, masalan 15 ham shartga mos kelib, Salqin bloki bajarilmay qoladi.
Ifodasiz switch murakkab if–else if zanjiriga o'qilishi qulay muqobil bo'la oladi. Oraliqlar, validatsiya va
bir-birini istisno qiladigan shartlarda ko'p qo'laniladi.
switch ichida qisqa e'lon
switch ifodasidan oldin qisqa buyruq yozish mumkin. Buyruq va ifoda nuqtali vergul bilan ajratiladi:
| main.go | |
|---|---|
Natija:
length := len(name) faqat bir marta bajariladi. length o'zgaruvchisi case va default bloklarida mavjud, ammo
switchdan tashqarida ko'rinmaydi. len() baytlar sonini qaytaradi.
break va fallthrough
Oddiy switchda break kerak emas. Lekin blokni ertaroq tugatish zarur bo'lsa, undan foydalanish mumkin:
break eng yaqin switch yoki forni tugatadi. Bu misolda bekorQilingan true bo'lsa, chop etish bajarilmaydi.
fallthrough mos kelgan blokdan keyingi caseni shartini tekshirmasdan bajaradi:
| main.go | |
|---|---|
Natija:
Warning
fallthrough keyingi case shartini tekshirmaydi. Shu sababli ehtiyotkorlik bilan va kam ishlatiladi.
Tip
fallthrough blokdagi oxirgi buyruq bo'lishi kerak. Oxirgi caseda ishlatilmaydi.
Qaysi qiymatlarni solishtirish mumkin?
Oddiy switchda ifoda va case qiymatlari o'zaro taqqoslanadigan bo'lishi kerak. Sonlar, string, bool, pointer,
channel, shuningdek faqat taqqoslanadigan maydonlardan tuzilgan array va struct qiymatlari ishlashi mumkin. Slice, map
va function qiymatlarini oddiy tenglik bilan solishtirib bo'lmagani uchun ular case qiymati bo'la olmaydi.
case qiymatlari compile vaqtida ma'lum konstanta bo'lishi shart emas. Ifodalar ham ishlatilishi mumkin. Biroq bir xil
konstantali caseni takrorlash kompilyatsiya xatosiga olib keladi:
// Noto'g'ri: ikkala case ham bir xil qiymat.
switch son {
case 1:
fmt.Println("bir")
case 1:
fmt.Println("yana bir")
}
Info
default ixtiyoriy. U bo'lmasa va hech bir case mos kelmasa, switch hech narsa bajarmaydi. Tashqi qiymatni
tekshirishda noma'lum holatni yashirmaslik uchun default ko'pincha foydali.
Keyingi qismda takrorlash operatori for siklini o'rganamiz.
Misollar
1. Bir nechta qiymatni bitta caseda tekshirish
package main
import "fmt"
func main() {
kun := "shanba"
switch kun {
case "shanba", "yakshanba":
fmt.Println("Dam olish kuni")
default:
fmt.Println("Ish kuni")
}
}
Vergul bilan yozilgan qiymatlardan bittasi mos kelsa, shu case bajariladi.
2. Ifodasiz switch bilan oraliq tekshirish
package main
import "fmt"
func main() {
ball := 86
switch {
case ball >= 90:
fmt.Println("A")
case ball >= 80:
fmt.Println("B")
case ball >= 70:
fmt.Println("C")
default:
fmt.Println("F")
}
}
switchdan keyin ifoda yozilmasa, har bir case mantiqiy shart sifatida tekshiriladi.
3. switch ichida boshlang‘ich qiymat
package main
import (
"fmt"
"time"
)
func main() {
switch soat := time.Now().Hour(); {
case soat < 12:
fmt.Println("Xayrli tong")
case soat < 18:
fmt.Println("Xayrli kun")
default:
fmt.Println("Xayrli kech")
}
}
soat faqat switch ichida ko‘rinadi. Nuqtali verguldan keyingi qism bo‘sh bo‘lgani uchun shartli caselar ishlaydi.
4. Oy nomidan faslni aniqlash
package main
import "fmt"
func main() {
oy := "aprel"
switch oy {
case "dekabr", "yanvar", "fevral":
fmt.Println("Qish")
case "mart", "aprel", "may":
fmt.Println("Bahor")
case "iyun", "iyul", "avgust":
fmt.Println("Yoz")
case "sentabr", "oktabr", "noyabr":
fmt.Println("Kuz")
default:
fmt.Println("Noma’lum oy")
}
}
Bir case ichida bir faslga tegishli bir nechta oy yoziladi. default noto‘g‘ri oy nomini alohida ko‘rsatadi.
5. Kalkulyator amalini tanlash
package main
import "fmt"
func main() {
a, b := 12, 4
amal := "/"
switch amal {
case "+":
fmt.Println(a + b)
case "-":
fmt.Println(a - b)
case "*":
fmt.Println(a * b)
case "/":
fmt.Println(a / b)
default:
fmt.Println("Noma’lum amal")
}
}
switch amal belgisiga qarab kerakli operatorni tanlaydi. Bo‘lish misolida b nol emasligi oldindan ma’lum.
6. Hisoblangan case qiymatlari
package main
import "fmt"
func main() {
a, b := 2, 3
natija := 6
switch natija {
case a + b:
fmt.Println("Yig‘indi")
case a * b:
fmt.Println("Ko‘paytma")
default:
fmt.Println("Mos emas")
}
}
case qiymati o‘zgaruvchilardan hisoblanishi ham mumkin. Bu yerda 6 ikkinchi casega mos keladi.
7. break bilan caseni erta tugatish
package main
import "fmt"
func main() {
buyruq, ruxsat := "delete", false
switch buyruq {
case "delete":
if !ruxsat {
fmt.Println("Ruxsat yo‘q")
break
}
fmt.Println("O‘chirildi")
default:
fmt.Println("Noma’lum buyruq")
}
}
Go har bir casedan avtomatik chiqadi. Ichki shartda blokni oldinroq tugatish kerak bo‘lsa, break foydali.
8. Belgini turkumlash
package main
import "fmt"
func main() {
belgi := 'e'
switch belgi {
case 'a', 'e', 'i', 'o', 'u':
fmt.Println("Unli")
default:
fmt.Println("Undosh yoki boshqa belgi")
}
}
switch rune qiymatlari bilan ham ishlaydi.
9. HTTP holat kodini guruhlash
package main
import "fmt"
func main() {
kod := 404
switch kod / 100 {
case 2:
fmt.Println("Muvaffaqiyatli")
case 4:
fmt.Println("Mijoz xatosi")
case 5:
fmt.Println("Server xatosi")
default:
fmt.Println("Boshqa javob")
}
}
Butun sonli bo‘lish kodning yuzlik raqamini ajratib, bir guruhdagi holatlarni birgalikda tekshiradi.
10. fallthrough bilan umumiy amalni davom ettirish
package main
import "fmt"
func main() {
daraja := "admin"
switch daraja {
case "admin":
fmt.Println("Sozlamalarni boshqarish")
fallthrough
case "editor":
fmt.Println("Maqolani tahrirlash")
fallthrough
case "reader":
fmt.Println("Maqolani o‘qish")
}
}
admindan keyingi bloklar shartsiz bajariladi. Huquqlar modeli uchun odatda aniq shartlar tushunarliroq; misol fallthrough xatti-harakatini ko‘rsatadi.