Sobes.tech
Junior — Middle

Quando si passano dati a una funzione: cosa è più efficiente in termini di utilizzo della memoria — un array o un slice?

sobes.tech AI

Risposta dell'AI

In Go, gli array hanno una dimensione fissa e vengono memorizzati completamente in memoria, mentre le slice sono strutture che contengono un puntatore a un array, una lunghezza e una capacità.

Dal punto di vista dell'uso della memoria:

  • Array: occupa esattamente la memoria per tutti gli elementi, la dimensione è nota in fase di compilazione.
  • Slice: di per sé occupa poca memoria (tre parole: puntatore, lunghezza, capacità), ma punta a un array che contiene i dati.

Nel passaggio a una funzione:

  • Se si passa un array, viene copiato interamente, il che può essere costoso in termini di memoria e tempo per array di grandi dimensioni.
  • Se si passa una slice, viene coperta solo la struttura della slice (puntatore + lunghezza + capacità), mentre i dati rimangono nell'array originale, quindi non avviene copia dei dati.

Pertanto, passare una slice è più efficiente in termini di utilizzo della memoria e delle prestazioni, specialmente per grandi insiemi di dati.

Esempio:

func processArray(arr [1000]int) {
    // copia l'intero array
}

func processSlice(s []int) {
    // copia solo la struttura della slice
}

func main() {
    var a [1000]int
    processArray(a)    // costoso
    processSlice(a[:]) // efficiente
}