Lektionen des Moduls (1/5)
Arrays mit fester Länge
In Go hat ein Array eine feste Länge, die in seinen Typ integriert ist: [N]T.
Es handelt sich um ein Grundelement, das selten direkt im Anwendungscode verwendet wird – das werden Sie tun
Arbeiten Sie fast immer mit Slices (nächste Lektion), die dynamisch sind
Ansichten über Arrays.
Dennoch ist es wichtig, Arrays gut zu verstehen: Alles in Go ist gebaut oben drauf.
Deklaration und Initialisierung
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 = 4Der Nullwert eines Arrays ist ein Array der angegebenen Länge mit jedem Element auf seinem Nullwert:
var nums [5]int // [0 0 0 0 0]Indizierung und len
a := [3]int{10, 20, 30}
fmt.Println(a[0]) // 10
a[1] = 99
fmt.Println(len(a)) // 3Ein Zugriff außerhalb des Bereichs führt zu einer Laufzeitpanik (kein stilles Undefiniertes). wie in C).
Länge ist Teil des Typs
var a [3]int
var b [4]int
// a = b // ERROR: different types[3]int und [4]int sind unterschiedliche Typen, auch wenn beide gelten
int. Aus diesem Grund werden Arrays selten an Funktionen übergeben: Sie müssten es tun
Codieren Sie die Länge fest in den Parametertyp.
Nach Wert kopieren
Im Gegensatz zu Slices (Referenz) und Maps (Referenz) werden Arrays von kopiert Wert:
a := [3]int{1, 2, 3}
b := a // copy
b[0] = 99
fmt.Println(a[0]) // 1 — a is unchangedDas Gleiche gilt bei der Übergabe an eine Funktion: Die Funktion erhält ihre eigenes Exemplar.
Wann werden Arrays verwendet?
- Puffer mit fester Größe, die zur Kompilierungszeit bekannt sind (z. B.
[16]bytefür einen MD5). - Zusammengesetzte Kartenschlüssel (Slices sind nicht „vergleichbar“, Arrays schon).
- Extreme Leistung (keine Indirektion, Cache-freundlich).
Für 99 % des Codes: Slices verwenden.
Probieren Sie es aus
Deklarieren Sie a als Array von 3 Ganzzahlen mit den Werten 10, 20, 30 und geben Sie seine Länge aus.
Hinweis anzeigen
Array-Literal: `[3]int{a, b, c}`.
Lösung nach 3 Versuchen verfügbar
Deklarieren Sie b als Array von 5 Ints (alle Nullen) und weisen Sie Position 2 99 zu.
Hinweis anzeigen
`var b [5]int` beginnt als [0 0 0 0 0].
Lösung nach 3 Versuchen verfügbar
Sind [3]int und [4]int vom gleichen Typ?
var a [3]int
var b [4]int
// a = b ?Zusammenfassung
[N]T: feste Länge, Teil des Typs.- Nullwert: jedes Element auf seinem Nullwert.
[...]int{...}lässt den Compiler auf die Länge schließen.- Kopieren nach Wert (einschließlich interner Funktionen).
- Außerhalb des Bereichs = Panik, nicht undefiniert.
- In der Praxis verwenden Sie Slices, bei denen es sich um Ansichten über Arrays handelt.