Перейти до основного вмісту
Модуль 4 · Урок 1 із 516/50 у курсі~8 min
Модульні уроки (1/5)

Масиви фіксованої довжини

У Go масив має фіксовану довжину, вписану в його тип: [N]T. Це примітив, який рідко використовується безпосередньо в коді додатків — ви будете майже завжди працювати з зрізами (наступний урок), які є динамічними перегляди масивів.

Тим не менш, добре розуміти масиви важливо: все в Go створено поверх них.

Оголошення та ініціалізація

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

Нульове значення масиву — це масив оголошеної довжини з кожним елемент при його нульовому значенні:

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

Індексація та len

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

Доступ поза межами діапазону викликає паніку під час виконання (а не тихий невизначений як у С).

Довжина є частиною типу

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

[3]int та [4]int є різними типами, навіть якщо обидва мають int. Ось чому масиви рідко передаються функціям: вам доведеться це зробити жорстко закодуйте довжину в тип параметра.

Копіювати за значенням

На відміну від фрагментів (посилання) і карт (посилання), масиви копіюються значення:

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

Те саме стосується переходу до функції: функція отримує своє власний екземпляр.

Коли використовувати масиви?

  • Буфери фіксованого розміру, відомі під час компіляції (наприклад, [16]byte для MD5).
  • Складені ключі карти (зрізи не є "порівняними", масиви є).
  • Надзвичайна продуктивність (немає непрямості, зручність кешу).

Для 99% коду: використовуйте фрагменти.

Спробуйте

вправи#go.m4.l1.e1
Спроби: 0Завантаження…

Оголошіть a як масив із 3 int зі значеннями 10, 20, 30 і виведіть його довжину.

Завантаження редактора…
Показати підказку

Літерал масиву: `[3]int{a, b, c}`.

Рішення доступне після 3 спроб

вправи#go.m4.l1.e2
Спроби: 0Завантаження…

Оголошіть b як масив із 5 цілих (усі нулі) і призначте 99 позиції 2.

Завантаження редактора…
Показати підказку

`перемінна b [5]int` починається як [0 0 0 0 0].

Рішення доступне після 3 спроб

Quiz#go.m4.l1.e3
Готовий

Чи [3]int і [4]int одного типу?

Go
var a [3]int
var b [4]int
// a = b ?
Варіанти відповідей

Підведення підсумків

  • [N]T: фіксована довжина, частина типу.
  • Нульове значення: кожен елемент має нульове значення.
  • [...]int{...} дозволяє компілятору визначити довжину.
  • Копіювати за значенням (включаючи внутрішні функції).
  • Поза діапазоном = паніка, не визначено.
  • На практиці використовуйте зрізи, які є переглядами масивів.