Go’da if, else if va else shartlari
Dastur har doim bir xil buyruqlarni bajaravermaydi. Ba’zan qiymat yoki holatga qarab turli yo‘nalishlardan birini tanlashi kerak. Masalan, foydalanuvchi voyaga yetgan bo‘lsa tizimga kirishga ruxsat berish, aks holda rad etish mumkin.
Kodning shartga qarab turli yo‘nalishda bajarilishi tarmoqlanish (branching) deyiladi. Go’da bunday tarmoqlanish if, else if va else yordamida yoziladi.
if sharti
if berilgan mantiqiy ifodani tekshiradi. Ifoda true bo‘lsa, { va } orasidagi kod bajariladi. false bo‘lsa, blok o‘tkazib yuboriladi.
Masalan:
| main.go | |
|---|---|
harorat > 30 taqqoslashining natijasi true, shuning uchun xabar ekranga chiqadi. harorat qiymati 25 bo‘lsa, if bloki bajarilmaydi.
Info
Go’da if sharti atrofida qavs yozish shart emas. Jingalak qavslar esa majburiy, blokda faqat bitta buyruq bo‘lsa ham yoziladi.
Shart bool bo‘lishi kerak
if ichidagi ifoda bool, ya’ni true yoki false qiymat qaytarishi kerak:
Go boshqa ayrim tillardagi kabi 0ni false, boshqa sonlarni true deb qabul qilmaydi:
Sonni aniq taqqoslash kerak:
Foydalanuvchi yoshini tekshirish
Konsoldan yosh olib, foydalanuvchi 18 yoshdan katta bo‘lsa xabar chiqaramiz:
| main.go | |
|---|---|
19 kiritilsa:
18 kiritilsa, xabar chiqmaydi. Sababi 18 > 18 ifodasi false. Agar 18 yosh ham ruxsat etilgan bo‘lsa, katta yoki teng operatori ishlatiladi:
Chegaraviy qiymatni aniq tanlash muhim:
yosh > 18— faqat 19 va undan katta qiymatlar;yosh >= 18— 18 hamda undan katta qiymatlar;yosh < 18— 18 dan kichik qiymatlar;yosh <= 18— 18 hamda undan kichik qiymatlar.
else: aks holda
Faqat if ishlatilsa, shart false bo‘lganida hech qanday muqobil kod bajarilmaydi. Xabarni if blokidan keyin oddiy yozish ham muammoni hal qilmaydi:
Bu kodda Mumkin emas! har doim chiqadi. Yosh 20 bo‘lsa, ikkala xabar ham ko‘rinadi, chunki ikkinchi Println() hech qanday shart ichida emas.
Ikki yo‘nalishdan aynan bittasini bajarish uchun else ishlatiladi:
Yosh misolini else bilan to‘ldiramiz:
| main.go | |
|---|---|
15 kiritilsa:
18 kiritilsa:
if va else bloklaridan faqat bittasi bajariladi. Shart true bo‘lsa if, aks holda else ishlaydi.
Warning
Go’da else yopuvchi } bilan bir qatorda yoziladi: } else {. elseni keyingi qatorga tushirish avtomatik nuqtali vergul qoidasi sababli sintaksis xatosiga olib keladi.
else if: bir nechta holat
Ba’zan ikkita emas, bir nechta holatdan birini tanlash kerak. else if qo‘shimcha shartlarni ketma-ket tekshiradi:
if birinchiShart {
// Birinchi shart true bo‘lsa bajariladi.
} else if ikkinchiShart {
// Birinchi false, ikkinchi true bo‘lsa bajariladi.
} else if uchinchiShart {
// Oldingi shartlar false, uchinchi true bo‘lsa bajariladi.
} else {
// Hech bir shart true bo‘lmasa bajariladi.
}
Go shartlarni yuqoridan pastga tekshiradi. Birinchi true shartning bloki bajarilgach, qolgan else if va else qismlari tekshirilmaydi.
Natijalar:
35kiritilsa, birinchi xabar chiqadi;22kiritilsa,Xush kelibsiz!chiqadi;15kiritilsa,Mumkin emas!chiqadi.
Bu yerda oraliqlar quyidagicha taqsimlanadi:
| Yosh | Bajariladigan blok |
|---|---|
30 va undan katta |
if yosh >= 30 |
18 dan 29 gacha |
else if yosh >= 18 |
18 dan kichik |
else |
Ikkinchi shartda yosh < 30 deb yozish shart emas. Dastur shu qatorga kelgan bo‘lsa, birinchi yosh >= 30 sharti allaqachon false bo‘lgan.
Shartlar tartibi muhim
Kengroq shartni oldin yozish keyingi aniqroq shartni yopib qo‘yishi mumkin:
if yosh >= 18 {
fmt.Println("18 yoki undan katta")
} else if yosh >= 30 {
fmt.Println("30 yoki undan katta")
}
Bu kodda yosh >= 30 bloki hech qachon bajarilmaydi. Masalan, 35 birinchi yosh >= 18 shartiga mos keladi va tekshiruv shu yerda tugaydi.
To‘g‘ri tartib — aniqroq yoki yuqori chegarali shartni oldin yozish:
if yosh >= 30 {
fmt.Println("30 yoki undan katta")
} else if yosh >= 18 {
fmt.Println("18 dan 29 gacha")
}
Shartlar oralig‘ini qog‘ozda yoki jadvalda ajratib olish takrorlangan va yetib bo‘lmaydigan holatlarni ko‘rishga yordam beradi.
Mantiqiy operatorlar bilan murakkab shart
&&, || va ! operatorlari yordamida bir nechta tekshiruvni bitta shartga birlashtirish mumkin.
&&: barcha shartlar bajarilishi kerak
| main.go | |
|---|---|
&& ishlatilganda ikkala shart ham true bo‘lishi kerak.
||: shartlardan bittasi yetarli
damOlishKuni := true
tatil := false
if damOlishKuni || tatil {
fmt.Println("Bugun dam olish mumkin.")
}
|| ishlatilganda kamida bitta shart true bo‘lsa, blok bajariladi.
!: qiymatni inkor qilish
!bloklangan qiymati bloklangan == false bilan bir xil ma’noni beradi, ammo ko‘pincha qisqaroq o‘qiladi.
Qiymat oralig‘ini tekshirish
Son ma’lum oraliqda ekanini tekshirish amaliy dasturlarda ko‘p uchraydi. Masalan, imtihon bali 0 dan 100 gacha bo‘lishi kerak:
Avval noto‘g‘ri oraliq tekshirildi. Keyin baholar yuqoridan pastga qarab joylashtirildi. Masalan, 90 birinchi baholash shartiga mos keladi; 75 birinchisidan o‘tmay, ikkinchisiga mos keladi.
Ichma-ich if
Bir if blokining ichida boshqa if yozish mumkin. Bu ichma-ich shart (nested if) deyiladi:
| main.go | |
|---|---|
Ichki if admin faqat tashqi tizimgaKirdi sharti true bo‘lganda tekshiriladi.
Ichma-ich bloklar ko‘payib ketsa, kodni o‘qish qiyinlashadi. Oddiy mantiqiy operator yoki erta return bilan tuzilmani soddalashtirish mumkin.
if ichida qisqa e’lon
Go if shartidan oldin qisqa buyruq yozishga ruxsat beradi. Buyruq va shart nuqtali vergul bilan ajratiladi:
| main.go | |
|---|---|
soni := len(sonlar) avval bajariladi, keyin soni > 0 tekshiriladi. Bu yerda slice faqat misol uchun ishlatilgan; slice mavzusi keyinroq batafsil o‘rganiladi.
Qisqa e’londa yaratilgan o‘zgaruvchi faqat if, unga bog‘langan else if va else bloklarida ko‘rinadi:
Bu usul vaqtinchalik natija faqat shart ichida kerak bo‘lganda qulay. Masalan, funksiya qaytargan errni tekshirishda ko‘p ishlatiladi.
Blok va ko‘rinish sohasi
if ichida e’lon qilingan o‘zgaruvchi shu blokdan tashqarida ko‘rinmaydi:
yosh := 20
if yosh >= 18 {
xabar := "Xush kelibsiz"
fmt.Println(xabar)
}
// fmt.Println(xabar) // kompilyatsiya xatosi
xabar faqat ifning {} bloki ichida mavjud. Agar qiymat blokdan keyin ham kerak bo‘lsa, o‘zgaruvchini ifdan oldin e’lon qilish kerak:
Erta return bilan kodni soddalashtirish
Xato holatlarni boshida tekshirib, funksiyani darhol tugatish ichma-ich bloklarni kamaytiradi:
Har bir noto‘g‘ri holat tekshirilgach, return main()ni tugatadi. Asosiy muvaffaqiyatli yo‘l esa ortiqcha else va chuqur ichma-ich bloklarsiz pastda qoladi. Bu usul guard clause deb ham ataladi.
Mustaqil iflar va else if zanjiri farqi
Bir nechta mustaqil if ishlatilsa, bir nechta blok bajarilishi mumkin:
Natijada Musbat ham, Juft ham chiqadi. Chunki ikkala shart alohida tekshiriladi.
if–else if–else zanjirida esa faqat birinchi mos blok bajariladi:
if son < 0 {
fmt.Println("Manfiy")
} else if son == 0 {
fmt.Println("Nol")
} else {
fmt.Println("Musbat")
}
Bir nechta xususiyat bir vaqtda tekshirilsa mustaqil iflar, bir-birini istisno qiladigan holatlardan bittasi tanlansa else if zanjiri mos keladi.
Keng uchraydigan xatolar
= va ==ni adashtirish
= qiymat beradi, == tenglikni tekshiradi:
Go’da if yosh = 18 shart sifatida ishlamaydi.
Chegarani noto‘g‘ri tanlash
Talab “18 va undan katta” bo‘lsa, > emas, >= kerak. 17, 18 va 19 kabi chegara atrofidagi qiymatlar mantiqni tekshirishga yordam beradi.
Yetib bo‘lmaydigan shart
Keng shartni aniq shartdan oldin yozmang:
// Noto‘g‘ri tartib:
if ball >= 56 {
fmt.Println("O‘tdi")
} else if ball >= 86 {
fmt.Println("A’lo") // bu blok bajarilmaydi
}
86 va undan yuqori ball birinchi shartga ham mos keladi. Shu sababli ball >= 86 oldin yozilishi kerak.
Kiritish xatosini e’tiborsiz qoldirish
fmt.Scan(&yosh) natijasini tekshirmaslik matn yoki noto‘g‘ri format kiritilganda dastur nol qiymat bilan davom etishiga sabab bo‘lishi mumkin. Tashqaridan kelgan qiymatning turi va ruxsat etilgan oralig‘ini doim tekshiring.
Xulosa
if shart true bo‘lganda blokni bajaradi. else shart false bo‘lgandagi muqobil yo‘lni, else if esa qo‘shimcha holatlarni ifodalaydi. Shartlar yuqoridan pastga tekshiriladi va zanjirdagi birinchi mos blok bajariladi. Chegaralar, shartlar tartibi va kiritilgan qiymatni tekshirish dastur mantiqining to‘g‘ri ishlashi uchun muhim.
Keyingi darsda bir qiymatni bir nechta aniq variant bilan solishtirish uchun switch operatoridan foydalanamiz.