Lecții din modul (1/5)
Matrice cu lungime fixă
În Go, o matrice are o lungime fixă, coaptă în tipul său: [N]T.
Este o primitivă rar folosită direct în codul aplicației - veți
aproape întotdeauna lucrați cu slice (lecția următoare), care sunt dinamice
vederi peste matrice.
Cu toate acestea, înțelegerea bine a matricelor este esențială: totul în Go este construit deasupra lor.
Declaratie si initializare
var a [3]int = [3]int{10, 20, 30}
b := [3]int{1, 2, 3} // inference with :=
c := [3]int{} // all zero: [0, 0, 0]
d := [...]int{1, 2, 3, 4} // length inferred = 4Valoarea zero a unui tablou este o matrice cu lungimea declarată cu fiecare element la valoarea sa zero:
var nums [5]int // [0 0 0 0 0]Indexare și len
a := [3]int{10, 20, 30}
fmt.Println(a[0]) // 10
a[1] = 99
fmt.Println(len(a)) // 3Accesul în afara intervalului provoacă o panică de rulare (nu un nedefinit silențios ca în C).
Lungimea face parte din tip
var a [3]int
var b [4]int
// a = b // ERROR: different types[3]int și [4]int sunt tipuri distincte, chiar dacă ambele țin apăsat
int. Acesta este motivul pentru care matricele sunt rareori transmise funcțiilor: ar trebui să faceți acest lucru
codificați lungimea în tipul de parametru.
Copiați după valoare
Spre deosebire de felii (referință) și hărți (referință), matricele sunt copiate de valoare:
a := [3]int{1, 2, 3}
b := a // copy
b[0] = 99
fmt.Println(a[0]) // 1 — a is unchangedAcelași lucru este valabil și atunci când treceți la o funcție: funcția o primește copie proprie.
Când să folosiți matrice?
- Buffere de dimensiune fixă cunoscute la momentul compilării (de exemplu,
[16]bytepentru un MD5). - Chei de hartă compusă (slicele nu sunt „comparabile”, matricele sunt).
- Performanță extremă (fără indirecte, cache-friendly).
Pentru 99% din cod: utilizați felii.
Încearcă
Declarați a ca o matrice de 3 inți cu valorile 10, 20, 30 și imprimați lungimea acestuia.
Afișează indiciu
Literal de matrice: `[3]int{a, b, c}`.
Soluție disponibilă după 3 încercări
Declarați b ca o matrice de 5 inți (toate zero) și atribuiți 99 poziției 2.
Afișează indiciu
`var b [5]int` începe ca [0 0 0 0 0].
Soluție disponibilă după 3 încercări
Sunt [3]int și [4]int același tip?
var a [3]int
var b [4]int
// a = b ?Recapitulare
[N]T: lungime fixă, parte a tipului.- Valoare zero: fiecare element la valoarea sa zero.
[...]int{...}permite compilatorului să deducă lungimea.- Copiere după valoare (inclusiv funcții interne).
- În afara limitei = panică, nu nedefinit.
- În practică, utilizați slices, care sunt vederi peste matrice.