Уроки модуля (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 как массив из трех целых чисел со значениями 10, 20, 30 и выведите его длину.
Показать подсказку
Литерал массива: `[3]int{a, b, c}`.
Решение доступно после 3 попыток
Объявите b как массив из 5 целых чисел (все нули) и присвойте 99 позиции 2.
Показать подсказку
`var 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{...}позволяет компилятору определить длину.- Копирование по значению (включая внутренние функции).
- Вне диапазона = паника, не неопределенная. – На практике используйте срезы, которые представляют собой представления массивов.