Sobes.tech
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.