Junior
Go'da slices qanday ishlaydi?
sobes.tech AI
AIdan javob
Bir dilim (slice), massiv ustida yengil qobiqdir. U o'zida ma'lumotlarni saqlamaydi, balki asosiy massivga murojaat qiladi.
Dilim tuzilishi:
- Asosiy massivga ko'rsatkich: Dilimdagi birinchi elementning manzili.
- Uzunlik (Length): Dilimdagi elementlar soni.
- Kapasite (Capacity): Asosiy massivdagi elementlar soni, dilim ko'rsatkichidan boshlab mavjud.
// Dilimni e'lon qilish misoli
var s []int
s = append(s, 1, 2, 3) // Elementlar qo'shish
// S dilimining ichki ko'rinishi (soddalashtirilgan)
// struct SliceHeader {
// Data uintptr // Asosiy massivga ko'rsatkich
// Len int // Dilim uzunligi
// Cap int // Dilimning kapasitesi
// }
make([]T, length, capacity)yordamida yaratilgan dilim, belgilangan kapasiteda asosiy massivni yaratadi va unga ko'rsatkich bilan bog'laydi, uzunligi belgilangan.- Array yoki boshqa dilimda (masalan,
arr[low:high:max]) bo'lak ishlatilganda, yangi dilim yaratiladi va u asosiy massivning bir xil xotira hududiga murojaat qiladi, lekin boshqacha ko'rsatkichlar, uzunlik va kapasite bilan. appendoperatsiyasi xotira reallokatsiyasini keltirib chiqarishi mumkin. Agar hozirgi kapasite yangi elementlarni qo'shishga yetarli bo'lmasa, Go yangi, kattaroq asosiy massiv yaratadi, eski elementlarni ko'chiradi va dilim ko'rsatkichini yangi massivga yangilaydi. Bu reallokatsiya deyiladi. Append bilan kapasitening o'sishi eksponent (juftlanadi) tarzda bo'ladi.- Dilimlar qiymat sifatida o'tkaziladi, lekin ular asosiy massivga ko'rsatkichga ega bo'lgani uchun, dilimdagi elementlar (indeks orqali) o'zgarishlari barcha dilimlarda ko'rinadi, ular bir xil asosiy massivga murojaat qiladi.
- Dilim uzunligini bo'lak yordamida o'zgartirish asosiy massivga ta'sir qilmaydi, lekin uning ma'lum qismlariga kirishni cheklashi mumkin.
Jadval: Length va Capacity taqqoslamasi
| Xususiyat | Uzunlik (Length) | Kapasite (Capacity) |
|---|---|---|
| Ta'rif | Dilimdagi haqiqiy elementlar soni | Dilimda bo'sh joy bo'lmagan maksimal elementlar soni |
| Kirish | s[i] yordamida elementlarga kirish uchun |
append bilan qo'shishdan oldin qancha element qo'shish mumkinligini belgilaydi |
| Olish | len(s) |
cap(s) |
// Kapasite va uzunlik bilan ishlash misoli
s := make([]int, 0, 5) // Uzunlik 0, kapasite 5
fmt.Println(len(s), cap(s)) // 0 5
s = append(s, 1, 2) // 2 element qo'shish
fmt.Println(len(s), cap(s)) // 2 5
s = append(s, 3, 4, 5, 6) // 4 element qo'shish, reallokatsiya talab qilinadi
fmt.Println(len(s), cap(s)) // 6 10 (kapasite oshdi)