array-uri în Go

Șir cu număr fix de elemente de același tip; lungimea face parte din tip, iar atribuirea copiază tot.

Sintaxă
var a [5]int
b := [3]string{"Iași", "Cluj", "Arad"}
c := [...]int{1, 2, 3}   // lungimea dedusă: 3

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.