for: kodni takrorlash
Sikl bir xil kodni qayta-qayta yozmasdan takrorlash imkonini beradi. Masalan, 1 dan 100 gacha sonlarni chiqarish, yig‘indini hisoblash yoki matndagi belgilarni navbat bilan ko‘rish uchun sikl kerak.
Go’da sikl uchun faqat for kalit so‘zi bor. U boshqa tillardagi klassik for, while va cheksiz sikl vazifalarini bajaradi.
Uch qismli for
Eng ko‘p uchraydigan shakl uchta qismdan iborat:
boshlashsikl boshlanishidan oldin bir marta bajariladi;sharthar bir iteratsiyadan oldin tekshiriladi;yangilashhar bir iteratsiya oxirida bajariladi.
Iteratsiya — sikl tanasining bir marta bajarilishi.
| main.go | |
|---|---|
Natija:
Avval i := 0 bir marta bajariladi. i < 5 true ekan, i chop etiladi. So‘ng i++ qiymatni bittaga oshiradi va shart yana tekshiriladi. i 5ga yetganda shart false bo‘ladi va sikl tugaydi.
i faqat for bloki ichida ko‘rinadi. Sikldan keyin fmt.Println(i) yozish kompilyatsiya xatosiga olib keladi.
Info
i++ Go’da faqat alohida buyruq sifatida ishlatiladi. x := i++ yoki if i++ > 2 deb yozib bo‘lmaydi.
Faqat shartli for
Boshlash va yangilash qismlarini tashqariga olib chiqilsa, for boshqa tillardagi while kabi ishlaydi:
| main.go | |
|---|---|
Natija:
Bu shaklda i sikldan oldin yaratilgani uchun undan sikldan keyin ham foydalanish mumkin. Yangilashni unutish xavfli: i o‘zgarmasa, i <= 3 doim true qoladi va sikl tugamaydi.
Cheksiz sikl
Shart ham yozilmasa, sikl cheksiz davom etadi:
Cheksiz sikl server, worker va hodisalarni qayta ishlovchi dasturlarda kerak bo‘ladi. Uni terminalni yopish bilan emas, dastur mantiqidagi break, return, signal yoki bekor qilish sharti bilan boshqarish lozim.
| main.go | |
|---|---|
Natija:
son > 3 bo‘lganda break eng yaqin forni darhol tugatadi. breakdan keyingi sikl tanasi bajarilmaydi.
continue: joriy iteratsiyani o‘tkazish
continue joriy iteratsiyaning qolgan qismini tashlab, keyingi iteratsiyaga o‘tadi. Quyidagi dastur faqat juft sonlarni chiqaradi:
| main.go | |
|---|---|
Natija:
i%2 sonni 2ga bo‘lgandagi qoldiqni beradi. Toq sonda qoldiq nol emas va continue sabab Println() bajarilmaydi. Uch qismli forda continuedan keyin yangilash qismi, ya’ni i++ baribir bajariladi.
Faqat juft sonlarni sanash kerak bo‘lsa, qadamni ikkiga oshirish yanada to‘g‘ri:
Bu variant toq sonlarni umuman tekshirmaydi. continue esa haqiqiy dasturda bir nechta filtrlash sharti bo‘lganda foydali.
Amaliy misol: kiritilgan sonlar yig‘indisi
Foydalanuvchidan nechta son kiritilishini olib, ularning yig‘indisini hisoblaymiz:
3, so‘ng 10, 20 va -5 kiritilsa:
Sonlar miqdorini kiriting: 3
1-sonni kiriting: 10
2-sonni kiriting: 20
3-sonni kiriting: -5
Yig‘indi: 25
count tashqi qiymat bo‘lgani uchun uning turi ham, ruxsat etilgan oralig‘i ham tekshirildi. Sikl aynan count marta ishlaydi. Har bir qiymat sum += number orqali yig‘indiga qo‘shiladi. count uchun yuqori chegara qo‘yish tasodifan juda uzoq sikl ishga tushishining oldini oladi.
Warning
Juda ko‘p yoki juda katta int qiymatlarni qo‘shish overflowga olib kelishi mumkin. Go signed integer overflowini runtime xatosi sifatida to‘xtatmaydi. Moliyaviy yoki ishonchsiz tashqi ma’lumot bilan ishlaganda chegaralarni talabga mos tekshirish zarur.
range bilan qiymatlar bo‘ylab yurish
range string, array, slice, map va channel elementlari bo‘ylab yurish uchun ishlatiladi. Quyidagi string misolida har bir Unicode belgi va uning boshlanish bayt indeksi olinadi:
| main.go | |
|---|---|
Natija:
indeks=0 belgi=G
indeks=1 belgi=o
indeks=2 belgi=‘
indeks=5 belgi=z
indeks=6 belgi=a
indeks=7 belgi=l
Indekslar 0, 1, 2, 5... bo‘lishining sababi ‘ belgisi UTF-8da uch bayt egallashidir. char turi rune bo‘ladi. String, byte va rune farqi keyingi darsda chuqurroq ko‘riladi.
Qiymatlardan biri kerak bo‘lmasa, bo‘sh identifikator _ ishlatiladi:
Faqat indeks kerak bo‘lsa, ikkinchi qiymatni yozmaslik mumkin:
Ichma-ich sikl va belgili break
Bir sikl ichida boshqa sikl yozish mumkin. Oddiy break faqat eng yaqin siklni tugatadi. Tashqi siklni ham tugatish kerak bo‘lsa, belgi (label) ishlatiladi:
| main.go | |
|---|---|
Natija:
break outer outer: belgisi qo‘yilgan tashqi siklni tugatadi. Belgilar chuqur ichma-ich boshqaruvda foydali, ammo ko‘p ishlatilsa kod oqimini tushunish qiyinlashadi.
Keng tarqalgan xatolar
Chegarani bittaga xato belgilash
i < 10 10ni o‘z ichiga olmaydi, i <= 10 esa oladi. Bu off-by-one xatosi deyiladi. Birinchi, oxirgi va bo‘sh oraliq holatlarini tekshirish muhim.
Hisoblagichni noto‘g‘ri tomonga o‘zgartirish
Shart, boshlang‘ich qiymat va yangilash bir-biriga mos bo‘lishi kerak. Pastga sanashda, masalan, for i := 10; i >= 1; i-- yoziladi.
Keraksiz cheksiz sikl
Faqat shartli forda shartga ta’sir qiluvchi qiymat yangilanmasa, sikl tugamaydi. Cheksiz sikl ataylab yozilganda ham undan chiqish yoki dasturni xavfsiz to‘xtatish mexanizmi bo‘lishi kerak.
break va continueni adashtirish
break siklni butunlay tugatadi. continue faqat joriy iteratsiyaning qolgan qismini o‘tkazadi. Qaysi biri kerakligini biznes qoidasi belgilaydi.
Xulosa
Go’dagi yagona sikl operatori fordir. U uch qismli, faqat shartli, cheksiz yoki rangeli shaklda yoziladi. break siklni tugatadi, continue keyingi iteratsiyaga o‘tadi. To‘xtash sharti, chegara qiymati va hisoblagich yo‘nalishini aniq belgilash sikl xatolarining oldini oladi.
Keyingi mavzularda range array, slice va map ma’lumotlari bilan ishlashda yana qo‘llanadi.