Sobes.tech
Назад к вопросам
Principal
31

Массивы и слайсы в Go — в чём разница? Как изменяется ёмкость слайса?

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

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

sobes.tech AI

В Go массивы и слайсы — разные типы данных:

  • Массив — фиксированного размера, размер входит в тип, например [5]int — массив из 5 элементов. Размер массива нельзя изменить после создания.

  • Слайс — динамический, представляет собой структуру с указателем на массив, длиной и ёмкостью. Слайс можно расширять, добавляя элементы.

Ёмкость слайса (capacity) — это максимальное количество элементов, которое слайс может вместить без выделения новой памяти.

При добавлении элементов с помощью append:

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

Пример:

arr := [5]int{1,2,3,4,5}       // массив фиксированного размера
slice := arr[1:3]              // слайс с длиной 2 и ёмкостью 4

fmt.Println(len(slice))        // 2
fmt.Println(cap(slice))        // 4

slice = append(slice, 10)      // добавляем элемент, длина становится 3
fmt.Println(len(slice))        // 3
fmt.Println(cap(slice))        // 4

slice = append(slice, 20, 30)  // добавляем ещё 2 элемента, длина 5
fmt.Println(len(slice))        // 5
fmt.Println(cap(slice))        // >=5, ёмкость увеличилась

Таким образом, слайсы удобны для работы с динамическими коллекциями, а массивы — для фиксированных данных.