Ce face array-uri
Un array are un număr fix de elemente, scris în tip: [5]int înseamnă exact 5 numere întregi. Lungimea face parte din tip, deci [3]int și [4]int sunt tipuri diferite. Elementele noi pornesc de la valoarea zero. Cu [...] compilatorul numără singur elementele din literal.
Spre deosebire de slice-uri, array-urile sunt valori: atribuirea și trimiterea la o funcție copiază toate elementele. Două array-uri de același tip se pot compara cu == și pot fi chei într-un map.
În practică, array-urile se folosesc rar direct; aproape tot codul lucrează cu slice-uri, care sunt „ferestre” peste un array. Array-urile sunt potrivite pentru date cu dimensiune fixă: coordonate, o tablă de joc, un hash ([32]byte).
Exemple
Exemplul 1: Creare, citire și parcurgere
package main
import "fmt"
func main() {
var temperaturi [7]float64
temperaturi[0] = 18.5
temperaturi[6] = 22.0
fmt.Println(temperaturi, len(temperaturi))
zile := [...]string{"luni", "marți", "miercuri"}
for i, z := range zile {
fmt.Println(i, z)
}
}
Rezultat
[18.5 0 0 0 0 0 22] 7
0 luni
1 marți
2 miercuri
Exemplul 2: Array-urile se copiază și se compară
b este o copie completă; modificarea ei nu schimbă a.
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
b := a // copie
b[0] = 100
fmt.Println("a:", a, "b:", b)
fmt.Println("a == b:", a == b)
fmt.Println("a == [3]int{1, 2, 3}:", a == [3]int{1, 2, 3})
// array-ul ca cheie într-un map
tabla := map[[2]int]string{{0, 0}: "X", {1, 1}: "O"}
fmt.Println("în centru:", tabla[[2]int{1, 1}])
}
Rezultat
a: [1 2 3] b: [100 2 3]
a == b: false
a == [3]int{1, 2, 3}: true
în centru: O
Exemplul 3: Matrice (array de array-uri)
package main
import "fmt"
func main() {
var tabla [3][3]rune
for i := range tabla {
for j := range tabla[i] {
tabla[i][j] = '.'
}
}
tabla[1][1] = 'X'
tabla[0][2] = 'O'
for _, rand := range tabla {
fmt.Println(string(rand[:]))
}
}
Rezultat
..O
.X.
...
Greșeli frecvente
- Index în afara array-ului cu o constantă: eroare de compilare (
invalid argument: index 7 out of bounds [0:7]); cu o variabilă: panic la rulare. - Trimiterea unui array mare la o funcție care trebuie să-l modifice: primește o copie. Trimite un slice (
a[:]) sau un pointer. - Folosirea unui array când numărul de elemente se schimbă: alege un slice.
Comenzi înrudite
slice-uri: Lista dinamică din Go: o fereastră peste un array, cu lungime (len) și capacitate (cap), care crește cu append.len și cap: len dă numărul de elemente (sau octeți la texte); cap dă capacitatea unui slice, array sau canal.range: Parcurge într-un for elementele unui slice, array, map, text, canal, număr sau iterator.