Slice Surgery
Slice bilan aniq amaliyot
deploys := []string{"v1.0.0", "v1.1.0", "v1.2.0", "v2.0.0"}
recent := deploys[2:] // ["v1.2.0", "v2.0.0"]
first2 := deploys[:2] // ["v1.0.0", "v1.1.0"]
middle := deploys[1:3] // ["v1.1.0", "v1.2.0"]Slice ifodalari [start:end] sintaksisidan foydalanadi. Start — kiritilgan (inclusive), end — kiritilmagan (exclusive). Start'ni tashlab ketsangiz, 0 dan boshlanadi. End'ni tashlab ketsangiz, oxirgi elementgacha davom etadi.
Odamlarni ushlab qoladigan bir narsa: sub-slicelar asl slice bilan bir xil tub massivni ulashadi. recent[0] ni o'zgartirsangiz, deploys[2] ham o'zgaradi. Bu ataylab shunday qilingan. Go so'ramaguningizcha ma'lumotni nusxalashdan qochadi.
Kesishdan oldin himoyalaning
s[:n] andazasi birinchi n ta elementni oladi. s[len(s)-n:] andazasi oxirgi n ta elementni oladi. Shunchaki n ning slice uzunligidan katta bo'lishidan himoyalaning, aks holda dastur qulaydi (panic).
Panic aynan indeksning o'zidan kelib chiqadi. n slicedan katta bo'lganda, len(s)-n manfiy bo'lib qoladi, manfiy indeksga esa ruxsat yo'q. Shuning uchun shu indeksni hisoblashdan oldin ikkita chegara holatini shu tartibda tekshiring:
- •
n <= 0: hech narsa so'ralmagan. Bo'sh slice qaytaring. - •
nslicedan katta: mavjudidan ko'proq so'ralgan. Butun slicani qaytaring.
Faqat ikkalasi ham inkor qilingandan keyingina len(s)-n kesish uchun xavfsiz indeks bo'ladi.
>_ Exercise
Sizda eng eskisidan yangisigacha tartiblangan deploy teglari slice'i bor. Ikkita funksiya yozing:
- •
RecentDeploys(tags []string, n int) []string— oxirginta tegni (eng yangi deploylarni) qaytaradi. - •
FirstDeploys(tags []string, n int) []string— birinchinta tegni (eng eski deploylarni) qaytaradi.
Qoidalar:
- •Agar
n > len(tags)bo'lsa, butun slicani qaytaring - •Agar
n <= 0bo'lsa, bo'sh slice qaytaring ([]string{})
Masalan, tags := []string{"v1.0.0", "v1.1.0", "v1.2.0", "v2.0.0", "v2.1.0"} berilgan bo'lsa:
- •
RecentDeploys(tags, 2)["v2.0.0", "v2.1.0"]qaytaradi - •
FirstDeploys(tags, 3)["v1.0.0", "v1.1.0", "v1.2.0"]qaytaradi
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
s[start:end] slice ifodalari bir xil tub massivga oynalar beradi. Kesishdan oldin har doim chegaralarni tekshiring.
NEXT UP
Remove Like a Pro
$ go run main.go
Kodingizni ishga tushiring