GoDasturchi
Slice Surgery

Slice Surgery

Slice bilan aniq amaliyot

example.go
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.
  • n slicedan 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 — oxirgi n ta tegni (eng yangi deploylarni) qaytaradi.
  • FirstDeploys(tags []string, n int) []string — birinchi n ta tegni (eng eski deploylarni) qaytaradi.

Qoidalar:

  • Agar n > len(tags) bo'lsa, butun slicani qaytaring
  • Agar n <= 0 bo'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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Slice Surgery

Slice bilan aniq amaliyot

example.go
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.
  • n slicedan 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 — oxirgi n ta tegni (eng yangi deploylarni) qaytaradi.
  • FirstDeploys(tags []string, n int) []string — birinchi n ta tegni (eng eski deploylarni) qaytaradi.

Qoidalar:

  • Agar n > len(tags) bo'lsa, butun slicani qaytaring
  • Agar n <= 0 bo'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.

Hints (0/3)

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