Sobes.tech
Назад к вопросам
Junior — Middle
145

При передаче данных в функцию: что более эффективно с точки зрения использования памяти — массив или срез?

Компании, где спрашивали
OZONOZON

Ответ от нейросети

sobes.tech AI

В Go массивы имеют фиксированный размер и хранятся полностью в памяти, тогда как срезы (slices) — это структура, которая содержит указатель на массив, длину и ёмкость.

С точки зрения использования памяти:

  • Массив — занимает память ровно под все элементы, размер известен на этапе компиляции.
  • Срез — сам по себе занимает немного памяти (три слова: указатель, длина, ёмкость), но указывает на массив, который хранит данные.

При передаче в функцию:

  • Если передать массив, он копируется целиком, что может быть дорого по памяти и времени при больших размерах.
  • Если передать срез, копируется только структура среза (указатель + длина + ёмкость), а данные остаются в исходном массиве, то есть копирования данных не происходит.

Поэтому передача среза более эффективна с точки зрения использования памяти и производительности, особенно для больших наборов данных.

Пример:

func processArray(arr [1000]int) {
    // копируется весь массив
}

func processSlice(s []int) {
    // копируется только структура среза
}

func main() {
    var a [1000]int
    processArray(a)    // дорого
    processSlice(a[:]) // эффективно
}