CodeBlanks Logo Icon CodeBlanks

len ve cap

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

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
s := make([]int, 0, 8)
fmt.Println(____(s))  // 8
Cevap
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

Başlangıç bölümündeki tüm dersler