Senior
Ce este un slice? Ce se află sub capota unui slice? Cum funcționează funcția append?
sobes.tech AI
Răspuns de la AI
În Go, un slice este un array dinamic care reprezintă o structură cu trei câmpuri:
- Punctator către array (array-ul subiacente în memorie)
- Lungime (len) — numărul de elemente disponibile în slice
- Capacitate (cap) — numărul maxim de elemente pe care array-ul subiacente îl poate conține începând de la punctator
Din spate, un slice este o structură mică, aproximativ astfel:
type sliceHeader struct {
Data uintptr // punctator către primul element al array-ului
Len int
Cap int
}
Funcția append adaugă elemente în slice. Dacă lungimea slice-ului este mai mică decât capacitatea, append pur și simplu scrie noile elemente în array-ul subiacente și crește lungimea. Dacă lungimea atinge capacitatea, append alocă un nou array cu o capacitate mărită (de obicei de două ori), copiază elementele vechi, adaugă cele noi și returnează un nou slice cu punctatorul actualizat.
Exemplu:
s := []int{1, 2, 3}
s = append(s, 4) // dacă cap(s) > len(s), adaugă pur și simplu 4
// dacă cap(s) == len(s), alocă un nou array, copiază [1,2,3], adaugă 4
Astfel, append poate returna un nou slice, și este important să atribuiți rezultatul din nou.