Sobes.tech
Senior

Slice nədir? Slice-in alt tərəfində nə var? append funksiyası necə işləyir?

sobes.tech Süni İntellekt

AI-dan cavab

Go dilində, dilim (slice) dinamik massivdir və üç sahədən ibarət strukturu təmsil edir:

  • Massivin göstəricisi (baza massiv yaddaşda)
  • Uzunluq (len) — dilimdə mövcud olan elementlərin sayı
  • Həcmi (cap) — göstəricidən başlayaraq baza massivinin tuta biləcəyi maksimum element sayı

Arxa planda, dilim kiçik bir strukturdur, təxminən belə:

type sliceHeader struct {
    Data uintptr // massivdə ilk elementə göstərici
    Len  int
    Cap  int
}

append funksiyası dilimə elementlər əlavə edir. Əgər dilimin uzunluğu həcmdən kiçikdirsə, append sadəcə yeni elementləri baza massivə yazır və uzunluğu artırır. Əgər uzunluq həcmi keçərsə, append yeni, artırılmış həcmlə massiv ayırır (adətən iki qat), köhnə elementləri köçürür, yeni elementləri əlavə edir və yenilənmiş göstərici ilə yeni dilim qaytarır.

Misal:

s := []int{1, 2, 3}
s = append(s, 4) // əgər cap(s) > len(s), sadəcə 4 əlavə edir

// əgər cap(s) == len(s), yeni massiv ayırır, [1,2,3] köçürür, 4 əlavə edir

Bu şəkildə, append yeni dilim qaytara bilər və nəticəni yenidən təyin etmək vacibdir.