Sobes.tech
Senior

Šta je slice? Šta se nalazi ispod haube slice-a? Kako funkcioniše funkcija append?

sobes.tech АИ

Одговор од АИ

U Go, rez (slice) je dinamički niz koji predstavlja strukturu sa tri polja:

  • Pokazivač na niz (podložni niz u memoriji)
  • Dužina (len) — broj dostupnih elemenata u rezu
  • Kapacitet (cap) — maksimalni broj elemenata koje podložni niz može da sadrži od pokazivača

U pozadini, rez je mala struktura, otprilike ovako:

type sliceHeader struct {
    Data uintptr // pokazivač na prvi element niza
    Len  int
    Cap  int
}

Funkcija append dodaje elemente u rez. Ako je dužina reza manja od kapaciteta, append jednostavno upisuje nove elemente u podložni niz i povećava dužinu. Ako dužina dostigne kapacitet, append dodeljuje novi niz sa većim kapacitetom (obično duplo veći), kopira stare elemente, dodaje nove i vraća novi rez sa ažuriranim pokazivačem.

Primer:

s := []int{1, 2, 3}
s = append(s, 4) // ako cap(s) > len(s), jednostavno doda 4

// ako cap(s) == len(s), dodeljuje novi niz, kopira [1,2,3], dodaje 4

Na ovaj način, append može da vrati novi rez, i važno je da rezultat ponovo dodelite.