Senior
Se lavoro con uno slice, lo prendo come parametro di funzione, faccio qualcosa con esso e continuo a lavorarci dopo la funzione — a cosa devo ricordarmi? Quali cambiamenti non vedremo dall'esterno?
sobes.tech AI
Risposta dell'AI
In Go, uno slice è una struttura che contiene un puntatore a un array, una lunghezza e una capacità. Quando passi uno slice a una funzione, viene copiata solo questa struttura (puntatore, lunghezza, capacità), non l'array stesso.
Cose importanti da ricordare:
- Le modifiche agli elementi dello slice all'interno della funzione (ad esempio,
s[0] = 10) saranno visibili dall'esterno, poiché puntano allo stesso array. - Le modifiche alla struttura dello slice stessa (ad esempio, assegnare un nuovo slice
s = append(s, 5)) non influenzeranno lo slice fuori dalla funzione, poiché solo la struttura viene copiata.
Esempio:
func modify(s []int) {
s[0] = 100 // cambierà l'elemento dell'array — visibile dall'esterno
s = append(s, 200) // modifica la copia locale dello slice — non visibile dall'esterno
}
s := []int{1, 2, 3}
modify(s)
fmt.Println(s) // Stampa [100 2 3], l'aggiunta di 200 non si rifletterà
In sintesi, le modifiche agli elementi dello slice sono visibili dall'esterno, mentre le modifiche alla lunghezza o alla capacità (tramite append, slices) no, a meno che non si ritorni un nuovo slice o si passi un puntatore allo slice.