Przejdź do głównej treści
eLearner.app
Moduł 4 · Lekcja 1 z 516/50 w kursie~8 min
Lekcje modułu (1/5)

Tablice o stałej długości

W Go tablica ma stała długość zapisaną w jej typie: [N]T. Jest to element prymitywny, rzadko używany bezpośrednio w kodzie aplikacji — tak się stanie prawie zawsze pracuj z plasterkami (następna lekcja), które są dynamiczne widoki na tablice.

Mimo to dobre zrozumienie tablic jest niezbędne: wszystko w Go jest zbudowane na nich.

Deklaracja i inicjalizacja

Go
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 = 4

Wartość zerowa tablicy jest tablicą o zadeklarowanej długości z każdym element o wartości zerowej:

Go
var nums [5]int  // [0 0 0 0 0]

Indeksowanie i len

Go
a := [3]int{10, 20, 30}
fmt.Println(a[0])      // 10
a[1] = 99
fmt.Println(len(a))    // 3

Dostęp poza zasięgiem powoduje panikę w czasie wykonywania (a nie cichą informację o błędzie niezdefiniowanym jak w C).

Długość jest częścią typu

Go
var a [3]int
var b [4]int
// a = b   // ERROR: different types

[3]int i [4]int to odrębne typy, mimo że oba są prawidłowe KODEF2. Właśnie dlatego tablice rzadko są przekazywane do funkcji: musiałbyś to zrobić zakoduj długość w typie parametru.

Kopiuj według wartości

W przeciwieństwie do plasterków (odniesienie) i map (odniesienie), tablice są kopiowane przez wartość:

Go
a := [3]int{1, 2, 3}
b := a               // copy
b[0] = 99
fmt.Println(a[0])    // 1 — a is unchanged

To samo dotyczy przejścia do funkcji: funkcja otrzymuje swoją własny egzemplarz.

Kiedy używać tablic?

  • Bufory o stałym rozmiarze znane w czasie kompilacji (np. [16]byte dla MD5).
  • Klucze mapy złożonej (wycinki nie są „porównywalne”, tablice są).
  • Ekstremalna wydajność (bez pośredniości, przyjazna dla pamięci podręcznej).

Dla 99% kodu: użyj plasterków.

Spróbuj

Ćwiczenie#go.m4.l1.e1
Próby: 0Ładowanie...

Zadeklaruj a jako tablicę 3 int o wartościach 10, 20, 30 i wydrukuj jej długość.

Ładowanie edytora...
Pokaż wskazówkę

Literal tablicowy: `[3]int{a, b, c}`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#go.m4.l1.e2
Próby: 0Ładowanie...

Zadeklaruj b jako tablicę zawierającą 5 intów (wszystkie zero) i przypisz 99 do pozycji 2.

Ładowanie edytora...
Pokaż wskazówkę

`var b [5]int` zaczyna się od [0 0 0 0 0].

Rozwiązanie dostępne po 3 próbach

Quiz#go.m4.l1.e3
Gotowe

Czy [3]int i [4]int są tego samego typu?

Go
var a [3]int
var b [4]int
// a = b ?
Opcje odpowiedzi

Podsumowanie

  • [N]T: stała długość, część typu.
  • Wartość zerowa: każdy element ma wartość zerową.
  • [...]int{...} pozwala kompilatorowi wywnioskować długość.
  • Kopiuj według wartości (w tym funkcji wewnętrznych).
  • Poza zasięgiem = panika, nie niezdefiniowana.
  • W praktyce używaj plastrów, które są widokami na tablice.