← Назад к вопросам

Какие операции можно совершать с массивом?

1.7 Middle🔥 212 комментариев
#Основы Go

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Операции с массивами в Go

Массив в Go — это структура данных фиксированной длины, содержащая элементы одного типа. Его ключевая особенность — статический размер, определяемый при компиляции и неизменяемый в runtime. Это фундаментальное отличие от динамических срезов (slice). Операции с массивами ограничены именно из-за фиксированной природы, но они включают базовые манипуляции, необходимые для работы с коллекциями данных.

Основные операции с массивами

1. Декларация и инициализация

Массив можно создать несколькими способами:

// Декларация с указанием размера
var arr1 [5]int // массив 5 нулей

// Инициализация значениями
arr2 := [3]string{"Go", "Java", "Python"}

// Автоматическое определение размера
arr3 := [...]int{1, 2, 3, 4, 5} // размер 5

// Частичная инициализация
arr4 := [5]int{1: 10, 3: 30} // [0, 10, 0, 30, 0]

2. Доступ и изменение элементов

Работа с элементами осуществляется по индексу (от 0 до len-1):

arr := [3]int{10, 20, 30}

// Получение значения
value := arr[1] // 20

// Изменение значения
arr[0] = 100 // теперь [100, 20, 30]

// Перебор элементов
for i := 0; i < len(arr); i++ {
    fmt.Println(arr[i])
}

// Перебор с range
for index, value := range arr {
    fmt.Printf("Index %d: %d\n", index, value)
}

3. Операции с размером и типом

  • Получение длины: функцией len()
    length := len(arr) // для arr [5]int вернет 5
    
  • Тип массива включает его размер: [3]int и [5]int — разные типы. Это важно при передаче в функции.

4. Сравнение массивов

Массивы можно сравнивать операторами == и !=, если их элементы сравнимы:

a := [2]int{1, 2}
b := [2]int{1, 2}
c := [2]int{1, 3}

fmt.Println(a == b) // true
fmt.Println(a == c) // false

5. Копирование массивов

  • Присваивание создает полную копию (поскольку массивы — value types):
    original := [3]int{1, 2, 3}
    copy := original
    copy[0] = 99
    fmt.Println(original) // [1, 2, 3] — исходный не изменен
    
  • Передача в функцию также происходит по значению (полная копия), что влияет на производительность для больших массивов.

Критические ограничения и обходные пути

Из-за фиксированного размера нельзя:

  • Добавлять или удалять элементы.
  • Динамически изменять размер.

Для работы с динамическими коллекциями используется срез (slice), который является "проекцией" на массив. Однако многие операции реализуются через массивы:

6. Конвертация в срез

Массив легко преобразуется в срез (без копирования данных):

arr := [5]int{1, 2, 3, 4, 5}
slice := arr[:] // срез, ссылающийся на весь массив
slice = arr[1:4] // срез элементов [2, 3, 4]

7. Многомерные массивы

Go поддерживает массивы массивов:

var matrix [2][3]int
matrix[0][1] = 5

Практические рекомендации

В реальных проектах массивы используются:

  • Для гарантии фиксированного размера (например, координаты, матрицы).
  • Когда нужна полная копия при присваивании.
  • В системах с ограничениями памяти, где динамическое выделение нежелательно.
  • Как базовый буфер для срезов или низкоуровневых операций.

Основная операция, недоступная для массива — изменение размера. Поэтому в 95% случаев разработчики используют срезы, которые предоставляют динамичность через функции append(), copy() и возможность "нарезать" существующие массивы. Но понимание массива как базовой структуры критически важно для оптимизации и понимания модели памяти Go.