Junior
Go-da dilimlər necə işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Slicing, array üzərində yüngül bir qabıqdır. O, məlumatları özündə saxlamır, əvəzinə əsas array-ə istinad edir.
Slice-in quruluşu:
- Əsas array-ə göstərici: Slice-in ilk elementinin ünvanı.
- Uzunluq (Length): Slice-dəki elementlərin sayı.
- Həcmi (Capacity): Əsas array-dəki elementlərin sayı, slice göstəricisindən başlayaraq mövcuddur.
// Slice-in elan olunması nümunəsi
var s []int
s = append(s, 1, 2, 3) // Elementlər əlavə edilir
// s slice-in daxili nümayişi (sadələşdirilmiş)
// struct SliceHeader {
// Data uintptr // Əsas array-ə göstərici
// Len int // Slice-in uzunluğu
// Cap int // Slice-in həcmi
// }
make([]T, length, capacity)istifadə edilərək yaradılan slice, göstərilən həcmdə əsas array yaradır və ona istinad edir, uzunluğu göstərilən kimi.- Array və ya başqa slice üzərində dilim istifadə edilərkən (məsələn,
arr[low:high:max]), yeni slice yaradılır və eyni yaddaş sahəsinə istinad edir, lakin fərqli göstəricilər, uzunluq və həcmlə. appendəməliyyatı yaddaşın yenidən ayrılmasına səbəb ola bilər. Əgər mövcud həcmi yeni elementləri əlavə etməyə kifayət etməzsə, Go daha böyük yeni əsas array yaradır, köhnə elementləri köçürür və slice göstəricisini yeni array-ə yeniləyir. Bu, realloctasiya adlanır.appendilə həcmin artması eksponensialdır (ikiqat artırılır müəyyən ölçüyə qədər, sonra yavaşlayır).- Slice-lər dəyər kimi ötürülür, lakin onlar əsas array-ə göstərici ehtiva etdiyindən, slice-dəki elementlərdə dəyişikliklər (indeks vasitəsilə) bütün slice-lərdə görünəcək.
- Slice-in uzunluğunu dilim vasitəsilə dəyişdirmək əsas array-ə təsir etmir, lakin onun bəzi məlumatlara girişini məhdudlaşdıra bilər.
Cədvəl: Length və Capacity müqayisəsi
| Xüsusiyyət | Uzunluq (Length) | Həcmi (Capacity) |
|---|---|---|
| Tərif | Slice-dəki faktiki elementlərin sayı | Slice-in realokasiya olmadan tutabileceyi maksimum element sayı |
| Giriş | s[i] ilə elementlərə giriş üçün istifadə olunur |
append ilə əlavə edilə biləcək elementlərin sayı, realokasiya öncəsi |
| Əldə etmə | len(s) |
cap(s) |
// Həcmi və uzunluğu ilə işləmə nümunəsi
s := make([]int, 0, 5) // Uzunluq 0, həcmi 5
fmt.Println(len(s), cap(s)) // 0 5
s = append(s, 1, 2) // 2 element əlavə edilir
fmt.Println(len(s), cap(s)) // 2 5
s = append(s, 3, 4, 5, 6) // 4 element daha əlavə edilir, realloctasiya tələb edir
fmt.Println(len(s), cap(s)) // 6 10 (həcmi artıb)