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
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 = 4Il valore zero di un array è un array della lunghezza dichiarata con tutti gli elementi al loro zero value:
var nums [5]int // [0 0 0 0 0]Indicizzazione e len
a := [3]int{10, 20, 30}
fmt.Println(a[0]) // 10
a[1] = 99
fmt.Println(len(a)) // 3Accessi fuori range causano panic a runtime (non un undefined silente come in C).
La lunghezza fa parte del tipo
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:
a := [3]int{1, 2, 3}
b := a // copia
b[0] = 99
fmt.Println(a[0]) // 1 — a non è cambiatoLo 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]byteper 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
Dichiara a come array di 3 int con valori 10, 20, 30 e stampane la lunghezza.
Mostra suggerimento
Letterale d'array: `[3]int{a, b, c}`.
Soluzione disponibile dopo 3 tentativi
Dichiara b come array di 5 int (tutti zero) e assegna 99 alla posizione 2.
Mostra suggerimento
`var b [5]int` parte da [0 0 0 0 0].
Soluzione disponibile dopo 3 tentativi
Sono lo stesso tipo [3]int e [4]int?
var a [3]int
var b [4]int
// a = b ?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.