Sobes.tech
Back to questions
Middle+
3

Чем отличается slice от массива в Go?

Companies where asked
Бюро 1440Бюро 1440

Answer from AI

sobes.tech AI

В Go массивы и срезы (slice) — это разные типы данных с разной семантикой и поведением.

  • Массив — это фиксированная по размеру последовательность элементов одного типа. Размер массива задаётся при объявлении и не может изменяться. Массивы передаются по значению, то есть копируются при присваивании или передаче в функцию.

  • Slice — это динамический, изменяемый по размеру «вид» на массив. Срез содержит указатель на базовый массив, длину и ёмкость. При изменении размера среза (например, добавлении элементов) может происходить выделение нового массива и копирование данных.

Пример:

var arr [3]int = [3]int{1, 2, 3} // массив фиксированного размера
var s []int = arr[:2]            // срез, ссылающийся на часть массива

s = append(s, 4) // добавление элемента, возможно выделение нового массива

Ключевые отличия:

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

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