Перейти к основному содержимому
Модуль 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 как массив из трех целых чисел со значениями 10, 20, 30 и выведите его длину.

Загрузка редактора…
Показать подсказку

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

Решение доступно после 3 попыток

Упражнение#go.m4.l1.e2
Попыток: 0Загрузка…

Объявите b как массив из 5 целых чисел (все нули) и присвойте 99 позиции 2.

Загрузка редактора…
Показать подсказку

`var 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{...} позволяет компилятору определить длину.
  • Копирование по значению (включая внутренние функции).
  • Вне диапазона = паника, не неопределенная. – На практике используйте срезы, которые представляют собой представления массивов.