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.