Vai al contenuto
eLearner.app
Modulo 4 · Lezione 1 di 516/50 nel corso~8 min
Lezioni del modulo (1/5)

Array a lunghezza fissa

In Go un array ha lunghezza fissa, parte integrante del suo tipo: [N]T. È un primitivo poco usato direttamente nel codice applicativo — quasi sempre lavorerai con le slice (prossima lezione) che sono viste dinamiche su array.

Capire bene gli array è comunque fondamentale: tutto in Go è costruito sopra di loro.

Dichiarazione e inizializzazione

Go
var a [3]int = [3]int{10, 20, 30}
b := [3]int{1, 2, 3}            // inferenza con :=
c := [3]int{}                   // tutti zero: [0, 0, 0]
d := [...]int{1, 2, 3, 4}       // lunghezza dedotta = 4

Il valore zero di un array è un array della lunghezza dichiarata con tutti gli elementi al loro zero value:

Go
var nums [5]int  // [0 0 0 0 0]

Indicizzazione e len

Go
a := [3]int{10, 20, 30}
fmt.Println(a[0])      // 10
a[1] = 99
fmt.Println(len(a))    // 3

Accessi fuori range causano panic a runtime (non un undefined silente come in C).

La lunghezza fa parte del tipo

Go
var a [3]int
var b [4]int
// a = b   // ERRORE: tipi diversi

[3]int e [4]int sono tipi distinti, anche se entrambi contengono int. Questo è il motivo per cui gli array sono raramente passati a funzioni: dovresti hard-codare la lunghezza nel tipo del parametro.

Copia per valore

Diversamente dalle slice (riferimento) e dai map (riferimento), gli array si copiano per valore:

Go
a := [3]int{1, 2, 3}
b := a               // copia
b[0] = 99
fmt.Println(a[0])    // 1 — a non è cambiato

Lo stesso vale per il passaggio a funzione: una funzione riceve la sua copia.

Quando usare gli array?

  • Buffer di dimensione fissa a compile-time (es. [16]byte per un MD5).
  • Chiavi di map composte (le slice non sono "comparable", gli array sì).
  • Performance estrema (no indirezione, cache-friendly).

Per il 99% del codice: usa le slice.

Prova tu

Esercizio#go.m4.l1.e1
Tentativi: 0Caricamento…

Dichiara a come array di 3 int con valori 10, 20, 30 e stampane la lunghezza.

Caricamento editor…
Mostra suggerimento

Letterale d'array: `[3]int{a, b, c}`.

Soluzione disponibile dopo 3 tentativi

Esercizio#go.m4.l1.e2
Tentativi: 0Caricamento…

Dichiara b come array di 5 int (tutti zero) e assegna 99 alla posizione 2.

Caricamento editor…
Mostra suggerimento

`var b [5]int` parte da [0 0 0 0 0].

Soluzione disponibile dopo 3 tentativi

Quiz#go.m4.l1.e3
Pronto

Sono lo stesso tipo [3]int e [4]int?

Go
var a [3]int
var b [4]int
// a = b ?
Opzioni di risposta

Recap

  • [N]T: lunghezza fissa, parte del tipo.
  • Zero value: tutti gli elementi al loro zero value.
  • [...]int{...} lascia dedurre la lunghezza al compilatore.
  • Copia per valore (anche nelle funzioni).
  • Out-of-range = panic, non undefined.
  • In pratica si usano le slice, viste su array.