Goda if, else if va else shart operatorlari
Dastur har doim bir xil buyruqlarni bajarmaydi. Ba'zan qiymat o'zgarish holatiga qarab turli mantiqlardan 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. Bunday tarmoqlanish if,
else if va else yordamida amalga oshiriladi.
if sharti
if berilgan mantiqiy ifodani tekshiradi. Ifoda true bo'lsa, { va } orasidagi kod bajariladi. false bo'lsa,
keyingi qismga o'tkazib yuboriladi.
Masalan:
| main.go | |
|---|---|
Natija:
harorat > 30 taqqoslashning natijasi true, shuning uchun xabar ekranga chiqadi. harorat qiymati 25 bo'lsa, if
bloki bajarilmaydi.
Info
Goda if sharti blokida jingalak qavslar bo'lishi majburiy, blokda faqat bitta buyruq bo'lsa ham qavslar yoziladi.
Shart bool bo'lishi kerak
if ichidagi ifoda bool, ya'ni true yoki false qiymat qaytarishi kerak:
Natija:
Go bazi tillardagi kabi 0ni false, boshqa sonlarni true deb qabul qilmaydi:
Foydalanuvchi yoshini tekshirish
Konsoldan yosh qiymatini 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 ishlatish kerak:
Qiymatlar chegarasini 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.
Info
_, err := fmt.Scan(&yosh) qanday ishlaydi?
fmt.Scan(&yosh) foydalanuvchi kiritgan qiymatni o‘qiydi va ikkita natija qaytaradi:
1. nechta qiymat muvaffaqiyatli o‘qilganini;
2. o‘qish vaqtida yuz bergan xatoni.
Bu yerda:- _ — birinchi natija bizga kerak emasligini bildiradi. Go tilida _ bo‘sh identifikator deb ataladi. U qiymatni qabul qiladi, lekin saqlamaydi;
- err — xato haqidagi qiymatni saqlaydi. Agar foydalanuvchi yosh o‘rniga matn kiritsa, err xato qiymatiga ega bo‘ladi;
- := — err o‘zgaruvchisini yaratadi va unga qiymat beradi;
- &yosh — kiritilgan qiymatni yosh o‘zgaruvchisiga yozish uchun uning xotiradagi manzilini fmt.Scan funksiyasiga uzatadi.
25 kiritsa, fmt.Scan taxminan quyidagi natijalarni qaytaradi:
Bu 1 ta qiymat muvaffaqiyatli o‘qilganini va xato bo‘lmaganini bildiradi. Bizga birinchi natija kerak bo‘lmagani uchun uni _ bilan e’tiborsiz qoldiramiz.
Agar foydalanuvchi yigirma deb kiritsa, qiymat int turiga mos kelmaydi va err ichida xato paydo bo‘ladi:
Go tilida nil — xato yo‘q degani. err != nil bo‘lsa, demak, qiymatni o‘qishda xato yuz bergan.
else aks holda
Faqat if ishlatilsa, shart false bo'lganida hech qanday 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.
else if bir nechta shart
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.
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 bo'ladi.
Shartlar tartibi muhim
Kengroq shart oldin yozilsa keyingi aniqroq shart bajarilmasligi 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")
}
Bir nechta shartlarni birlashtirish
&&, || 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 ko'rinish bo'lgani uchun
inkor ko'rinishidan foydalaniladi.
Qiymat oralig'ini tekshirish
Son ma'lum oraliqda ekanini tekshirish 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 return bilan 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 | |
|---|---|
hisob := pul; avval bajariladi, keyin hisob > 5 tekshiriladi.
Qisqa e'londa yaratilgan o'zgaruvchi faqat if, unga bog'langan else if va else bloklarida ishlaydi:
if son := 10; son > 0 {
fmt.Println(son)
}
// fmt.Println(son) // bu yerda songa murojaat qilib bo'lmaydi
Bu usul vaqtinchalik natija faqat shart ichida kerak bo'lganda qulay. Masalan, funksiya qaytargan errni tekshirishda
ko'p ishlatiladi.
Murojaat qilish chegarasi
if ichida e'lon qilingan o'zgaruvchiga shu blokdan tashqarida murojaat qilib bo'lmaydi:
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:
return bilan kodni soddalashtirish
Xato holatlarni boshida tekshirib, funksiyani darhol tugatish ichma-ich shartlarni kamaytiradi:
Har bir noto'g'ri holat tekshirilgach, return main() funksiyasi ishini tugatadi. Ortiqcha else va
va ichma-ich shartlar tekshirilmaydi.
if va else if lardan foydalanish farqi
Bir nechta if ishlatilsa bir nechta blok bajariladi:
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 har-xil holatlar sharti bir vaqtda tekshirilsa faqat iflardan, bir-birini istisno qiladigan holatlardan
bittasi tanlanadigan holatlarda else if mos keladi.
Warning
fmt.Scan(&) natijasini tekshirmaslik matn yoki noto'g'ri format kiritilganda dastur xato qiymat bilan davom
etishiga sabab bo'lishi mumkin. Tashqaridan kelgan qiymatning turi va ruxsat etilgan shartlarga mosligini doim tekshiring.
Keyingi qismda bir qiymatni bir nechta aniq variant bilan solishtirish uchun switch operatoridan
foydalanishni o'rganamiz.
Misollar
1. Sonning ishorasini aniqlash
package main
import "fmt"
func main() {
son := -7
if son > 0 {
fmt.Println("Musbat")
} else if son < 0 {
fmt.Println("Manfiy")
} else {
fmt.Println("Nol")
}
}
Uch holat bir-birini istisno qiladi, shuning uchun ulardan faqat bittasi bajariladi.
2. Kabisa yilini tekshirish
package main
import "fmt"
func main() {
yil := 2024
kabisa := yil%400 == 0 || yil%4 == 0 && yil%100 != 0
if kabisa {
fmt.Println("Kabisa yili")
} else {
fmt.Println("Oddiy yil")
}
}
400ga bo‘linadigan yoki 4ga bo‘linib, 100ga bo‘linmaydigan yil kabisa bo‘ladi.
3. Uch sondan kattasini topish
package main
import "fmt"
func main() {
a, b, c := 12, 27, 19
katta := a
if b > katta {
katta = b
}
if c > katta {
katta = c
}
fmt.Println(katta)
}
Har bir mustaqil if joriy eng katta qiymatni yangilashi mumkin.
4. Uchburchak mavjudligini tekshirish
package main
import "fmt"
func main() {
a, b, c := 3, 4, 5
if a > 0 && b > 0 && c > 0 && a+b > c && a+c > b && b+c > a {
fmt.Println("Uchburchak mavjud")
} else {
fmt.Println("Uchburchak mavjud emas")
}
}
Tomonlar musbat va istalgan ikki tomon yig‘indisi uchinchi tomondan katta bo‘lishi kerak.
5. Ichma-ich tekshiruv
package main
import "fmt"
func main() {
login, parol := "admin", "go123"
if login == "admin" {
if parol == "go123" {
fmt.Println("Kirish muvaffaqiyatli")
} else {
fmt.Println("Parol noto‘g‘ri")
}
} else {
fmt.Println("Foydalanuvchi topilmadi")
}
}
Ichki if faqat login to‘g‘ri bo‘lganda parolni tekshiradi.
6. if ichida o‘zgaruvchi e’lon qilish
package main
import "fmt"
func main() {
if son := 42; son%2 == 0 {
fmt.Println(son, "juft son")
} else {
fmt.Println(son, "toq son")
}
}
son boshlang‘ich qismda e’lon qilinadi. U faqat shu if hamda uning else blokida ko‘rinadi.
7. Bo‘sh qiymatga standart nom berish
package main
import "fmt"
func main() {
ism := ""
if ism == "" {
ism = "Mehmon"
}
fmt.Println("Salom,", ism)
}
Bitta shartli o‘zgarish uchun else yozish shart emas.
8. Chegirma darajasini tanlash
package main
import "fmt"
func main() {
xarid := 750_000
chegirma := 0
if xarid >= 1_000_000 {
chegirma = 15
} else if xarid >= 500_000 {
chegirma = 10
} else if xarid >= 100_000 {
chegirma = 5
}
fmt.Println(chegirma, "%")
}
Tekshiruv katta chegaradan boshlanadi. Aks holda kichik chegara avval mos kelib qoladi.
9. Nolga bo‘lishdan oldin tekshirish
package main
import "fmt"
func main() {
son, boluvchi := 20, 0
if boluvchi != 0 {
fmt.Println("Natija:", son/boluvchi)
} else {
fmt.Println("Nolga bo‘lish mumkin emas")
}
}
Bo‘lish amali faqat bo‘luvchi nol bo‘lmaganda bajariladi. Bu tekshiruv dasturning bajarilish vaqtida xato bilan to‘xtashini oldini oladi.
10. Qiymatni oraliqqa keltirish
package main
import "fmt"
func main() {
ovoz := 120
if ovoz < 0 {
ovoz = 0
} else if ovoz > 100 {
ovoz = 100
}
fmt.Println(ovoz)
}
Natija 100. Bu usul tashqi qiymatning ruxsat etilgan chegaradan chiqib ketishiga yo‘l qo‘ymaydi.