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
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 = 4Wartość zerowa tablicy jest tablicą o zadeklarowanej długości z każdym element o wartości zerowej:
var nums [5]int // [0 0 0 0 0]Indeksowanie i len
a := [3]int{10, 20, 30}
fmt.Println(a[0]) // 10
a[1] = 99
fmt.Println(len(a)) // 3Dostę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
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ść:
a := [3]int{1, 2, 3}
b := a // copy
b[0] = 99
fmt.Println(a[0]) // 1 — a is unchangedTo 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]bytedla 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
Zadeklaruj a jako tablicę 3 int o wartościach 10, 20, 30 i wydrukuj jej długość.
Pokaż wskazówkę
Literal tablicowy: `[3]int{a, b, c}`.
Rozwiązanie dostępne po 3 próbach
Zadeklaruj b jako tablicę zawierającą 5 intów (wszystkie zero) i przypisz 99 do pozycji 2.
Pokaż wskazówkę
`var b [5]int` zaczyna się od [0 0 0 0 0].
Rozwiązanie dostępne po 3 próbach
Czy [3]int i [4]int są tego samego typu?
var a [3]int
var b [4]int
// a = b ?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.