Модульні уроки (1/5)
Масиви фіксованої довжини
У Go масив має фіксовану довжину, вписану в його тип: [N]T.
Це примітив, який рідко використовується безпосередньо в коді додатків — ви будете
майже завжди працювати з зрізами (наступний урок), які є динамічними
перегляди масивів.
Тим не менш, добре розуміти масиви важливо: все в 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Нульове значення масиву — це масив оголошеної довжини з кожним елемент при його нульовому значенні:
var nums [5]int // [0 0 0 0 0]Індексація та len
a := [3]int{10, 20, 30}
fmt.Println(a[0]) // 10
a[1] = 99
fmt.Println(len(a)) // 3Доступ поза межами діапазону викликає паніку під час виконання (а не тихий невизначений як у С).
Довжина є частиною типу
var a [3]int
var b [4]int
// a = b // ERROR: different types[3]int та [4]int є різними типами, навіть якщо обидва мають
int. Ось чому масиви рідко передаються функціям: вам доведеться це зробити
жорстко закодуйте довжину в тип параметра.
Копіювати за значенням
На відміну від фрагментів (посилання) і карт (посилання), масиви копіюються значення:
a := [3]int{1, 2, 3}
b := a // copy
b[0] = 99
fmt.Println(a[0]) // 1 — a is unchangedТе саме стосується переходу до функції: функція отримує своє власний екземпляр.
Коли використовувати масиви?
- Буфери фіксованого розміру, відомі під час компіляції (наприклад,
[16]byteдля MD5). - Складені ключі карти (зрізи не є "порівняними", масиви є).
- Надзвичайна продуктивність (немає непрямості, зручність кешу).
Для 99% коду: використовуйте фрагменти.
Спробуйте
Оголошіть a як масив із 3 int зі значеннями 10, 20, 30 і виведіть його довжину.
Показати підказку
Літерал масиву: `[3]int{a, b, c}`.
Рішення доступне після 3 спроб
Оголошіть b як масив із 5 цілих (усі нулі) і призначте 99 позиції 2.
Показати підказку
`перемінна b [5]int` починається як [0 0 0 0 0].
Рішення доступне після 3 спроб
Чи [3]int і [4]int одного типу?
var a [3]int
var b [4]int
// a = b ?Підведення підсумків
[N]T: фіксована довжина, частина типу.- Нульове значення: кожен елемент має нульове значення.
[...]int{...}дозволяє компілятору визначити довжину.- Копіювати за значенням (включаючи внутрішні функції).
- Поза діапазоном = паніка, не визначено.
- На практиці використовуйте зрізи, які є переглядами масивів.