Senior
Cos'è uno slice? Cosa c'è sotto il cofano di uno slice? Come funziona la funzione append?
sobes.tech AI
Risposta dell'AI
In Go, uno slice è un array dinamico che rappresenta una struttura con tre campi:
- Puntatore all'array (array sottostante in memoria)
- Lunghezza (len) — numero di elementi disponibili nello slice
- Capacità (cap) — massimo numero di elementi che l'array sottostante può contenere a partire dal puntatore
Dietro le quinte, uno slice è una piccola struttura, circa così:
type sliceHeader struct {
Data uintptr // puntatore al primo elemento dell'array
Len int
Cap int
}
La funzione append aggiunge elementi allo slice. Se la lunghezza dello slice è inferiore alla capacità, append semplicemente scrive i nuovi elementi nell'array sottostante e aumenta la lunghezza. Se la lunghezza raggiunge la capacità, append assegna un nuovo array con capacità aumentata (di solito il doppio), copia gli elementi vecchi, aggiunge i nuovi e restituisce un nuovo slice con il puntatore aggiornato.
Esempio:
s := []int{1, 2, 3}
s = append(s, 4) // se cap(s) > len(s), aggiunge semplicemente 4
// se cap(s) == len(s), assegna un nuovo array, copia [1,2,3], aggiunge 4
In questo modo, append può restituire un nuovo slice, ed è importante assegnare nuovamente il risultato.