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 holat 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 case bloki bajariladi va switch tugaydi. Hech biri mos kelmasa, ixtiyoriy default bloki bajariladi.
Info
Go’da har bir case oxiriga break yozish shart emas. Mos blok bajarilgach, keyingi casega avtomatik o‘tilmaydi. Bu xususiyat Go’ni C, Java va JavaScript kabi tillardan farqlaydi.
Hafta kunini aniqlash
5 kiritilsa:
kun qiymati har bir case bilan tenglik bo‘yicha solishtiriladi. 5 faqat case 5ga mos keladi. 0 yoki 8 kabi qiymatlar hech bir kunga mos emas, shuning uchun default xato xabarini chiqaradi. Matn kiritilsa, fmt.Scan() qaytargan err tekshiruvi dasturni noto‘g‘ri qiymat bilan davom ettirmaydi.
Bitta caseda bir nechta qiymat
Bir xil amal bajaradigan 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, bu string switch ichida case 1 yozib bo‘lmaydi.
Ifodasiz switch
switchdan keyingi ifodani yozmaslik mumkin. Bunday yozuv switch true bilan bir xil ishlaydi 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 kengroq 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 uchraydi.
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; Unicode matnlar uzunligi keyingi string darsida batafsil tushuntiriladi.
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 esa mos blokdan keyingi case tanasini uning shartini tekshirmasdan bajaradi:
| main.go | |
|---|---|
Natija:
Warning
fallthrough keyingi case shartini tekshirmaydi. Shu sababli u ehtiyotkorlik bilan va kam ishlatiladi. Bir xil natija uchun bir nechta qiymatni vergul bilan yozish odatda aniqroq.
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 xatosi:
// Noto‘g‘ri: ikkala case ham bir xil qiymat.
switch son {
case 1:
fmt.Println("bir")
case 1:
fmt.Println("yana bir")
}
Keng tarqalgan xatolar
Har bir casedan keyin avtomatik o‘tishni kutish
Go birinchi mos blokdan keyin switchni tugatadi. Bir nechta qiymat bir xil amalni bajarsa, ularni case "a", "b": shaklida birlashtiring. Keyingi blokni ataylab ham bajarish kerak bo‘lsagina fallthrough ishlating.
defaultni majburiy deb o‘ylash
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.
Shartlarni noto‘g‘ri tartiblash
Ifodasiz switchda birinchi true shart yutadi. Keng shartni oldin yozish keyingi aniq shartni yetib bo‘lmaydigan qiladi. Chegara qiymatlarini, masalan 19, 20 va 21ni alohida tekshirish bunday xatoni topishga yordam beradi.
Xulosa
switch bir nechta holatdan birini aniq ifodalaydi. Oddiy shaklda u bitta qiymatni caselar bilan solishtiradi. Ifodasiz shaklda esa mantiqiy shartlarni tekshiradi. Birinchi mos blok bajariladi, default noma’lum holatni ushlaydi va Go’da odatda break kerak emas.
Keyingi darsda kodni ma’lum shart bajarilguncha takrorlash uchun for siklini o‘rganamiz.