Sobes.tech
Senior

Slice nedir? Slicing'in altında ne var? append fonksiyonu nasıl çalışır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go dilinde, dilim (slice) dinamik bir dizidir ve üç alan içeren bir yapıyı temsil eder:

  • Diziye işaretçi (bellekteki temel dizi)
  • Uzunluk (len) — dilimde erişilebilir öğe sayısı
  • Kapasite (cap) — işaretçiden başlayarak temel dizinin alabileceği maksimum öğe sayısı

Arka planda, dilim küçük bir yapıdır, yaklaşık olarak şu şekildedir:

type sliceHeader struct {
    Data uintptr // dizinin ilk öğesine işaretçi
    Len  int
    Cap  int
}

append fonksiyonu, dilime öğeler ekler. Eğer dilimin uzunluğu kapasiteden küçükse, append yeni öğeleri doğrudan temel diziye yazar ve uzunluğu artırır. Eğer uzunluk kapasiteye ulaşmışsa, append yeni bir dizi tahsis eder (genellikle iki katı büyüklükte), eski öğeleri kopyalar, yeni öğeleri ekler ve güncellenmiş işaretçi ile yeni bir dilim döner.

Örnek:

s := []int{1, 2, 3}
s = append(s, 4) // cap(s) > len(s) ise, sadece 4 ekler

// cap(s) == len(s) ise, yeni bir dizi tahsis eder, [1,2,3] kopyalar, 4 ekler

Bu şekilde, append yeni bir dilim dönebilir ve sonucu tekrar atamak önemlidir.