Junior
Qual è la differenza chiave tra slice e array in Go?
sobes.tech AI
Risposta dell'AI
Gli slice sono viste di array che possono cambiare dinamicamente.
| Caratteristica | Array | Slice |
|---|---|---|
| Dimensione | Fissa, determinata al momento della creazione | Dinamica, può cambiare |
| Tipo | [n]T (dove n è la dimensione, T il tipo) |
[]T (dove T è il tipo) |
| Passaggio alle funzioni | Per valore (copia) | Per riferimento all'array sottostante, si passano head, len e cap (in realtà, viene creata una nuova struttura SliceHeader con copie di questi campi) |
| Creazione | var a [5]int o b := [3]string{"a", "b", "c"} |
var s []int o t := []int{1, 2, 3} o u := make([]int, 5) |
| Prestazioni | Più prevedibile grazie alla dimensione fissa, può essere più efficiente per dimensioni piccole | Può avere overhead durante le modifiche di dimensione (rileallocazione dell'array sottostante) |
// Esempio di array
var arr [3]int = [3]int{1, 2, 3}
// Esempio di slice creato dall'array
slice := arr[1:] // slice {2, 3}
// Esempio di creazione di uno slice
s := []int{10, 20, 30} // array sottostante {10, 20, 30}, len = 3, cap = 3
// Modifica dello slice
s = append(s, 40) // ora s {10, 20, 30, 40}. Se la capacità non è sufficiente, viene creato un nuovo array sottostante, len = 4, cap = 6 (solitamente raddoppia la capacità).
// La modifica di un elemento dello slice modifica l'array sottostante
slice[0] = 99 // arr ora {1, 99, 3}
fmt.Println(arr)