len ve cap
- Go kursu
- Başlangıç
- Ders 45/90
- 4 dk
Slice'ın uzunluğu ve kapasitesini öğrenirsin.
len ve cap
len(s) dilimdeki eleman sayısı, cap(s) alttaki dizide dilimin başlangıcından itibaren kullanılabilecek toplam yerdir. Uzunluk kapasiteyi aşamaz.
s := make([]int, 2, 5)
fmt.Println(len(s), cap(s)) // 2 5
s = append(s, 1, 2, 3)
fmt.Println(len(s), cap(s)) // 5 5
s = append(s, 9)
fmt.Println(len(s), cap(s)) // 6 10 (yeni dizi)Kapasite dolunca Go genellikle kapasiteyi ikiye katlar (büyük dilimlerde daha az büyür).
Büyüme maliyeti
Her büyümede tüm elemanlar yeni diziye kopyalanır. 1 milyon elemanı tek tek eklemek yaklaşık 20 büyüme demektir; baştan make([]T, 0, 1_000_000) ile bu kopyaların hiçbiri yapılmaz. Büyük dilimlerden küçük bir alt dilim saklarsan, alttaki büyük dizi de bellekte kalır; gerekirse küçük parçayı slices.Clone ile kopyala.
Uygulama Büyümeyi izle
Boş bir []int dilimine 1'den 5'e kadar sayıları tek tek append et; her eklemeden sonra len ve cap değerlerini fmt.Println(len(s), cap(s)) ile yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
func main() {
var s []int
for i := 1; i <= 5; i++ {
s = append(s, i)
fmt.Println(len(s), cap(s))
}
}Beklenen çıktı
1 1 2 2 3 4 4 4 5 8
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>s := []int{1, 2, 3, 4, 5}</code> için <code>cap(s[2:])</code> kaçtır?
- 2
- 0
- 3 Doğru cevap
- 5
Açıklama: Alt dilimin kapasitesi başlangıç noktasından alttaki dizinin sonuna kadar olan yerdir: 5 - 2 = 3.
2 Kapasite
s := make([]int, 0, 8)
fmt.Println(____(s)) // 8
s := make([]int, 0, 8)
fmt.Println(cap(s)) // 8
Açıklama: cap dilimin alttaki dizideki toplam kapasitesini verir.
3 Dilim ve len/cap
| Kavram | Anlamı |
|---|---|
make([]int, 3) |
3 / 3 |
make([]int, 0, 4) |
0 / 4 |
[]int{1, 2}[1:] |
1 / 1 |
var s []int |
0 / 0 |