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