Senior
Slice nima? Slice ning ichki qismi nima? append funksiyasi qanday ishlaydi?
sobes.tech AI
AIdan javob
Go tilida, dilim (slice) dinamik massiv bo'lib, uchta maydonni o'z ichiga oladi:
- Massivga ishorat (baza massivdagi joy)
- Uzunlik (len) — dilimda mavjud bo'lgan elementlar soni
- Quvvat (cap) — boshlang'ich massivning maksimal elementlar soni, u ishoratdan boshlanadi
Orqa fonida, dilim kichik tuzilma bo'lib, taxminan shunday:
type sliceHeader struct {
Data uintptr // massivning birinchi elementiga ishorat
Len int
Cap int
}
append funksiyasi dilimga elementlar qo'shadi. Agar dilim uzunligi quvvatdan kichik bo'lsa, append oddiygina yangi elementlarni asosiy massivga yozadi va uzunlikni oshiradi. Agar uzunlik quvvatga teng bo'lsa, append yangi, kengaytirilgan quvvat bilan massiv ajratadi (odatda ikki baravar), eski elementlarni ko'chiradi, yangi elementlarni qo'shadi va yangilangan ishorat bilan yangi dilimni qaytaradi.
Misol:
s := []int{1, 2, 3}
s = append(s, 4) // agar cap(s) > len(s), faqat 4 ni qo'shadi
// agar cap(s) == len(s), yangi massiv ajratadi, [1,2,3] ni ko'chiradi, 4 ni qo'shadi
Shu tarzda, append yangi dilimni qaytarishi mumkin va natijani qayta tayinlash muhimdir.