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

Изменяется ли исходный срез при добавлении элементов через append в Go?

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

sobes.tech AI

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

  • Если в срезе достаточно ёмкости (capacity), то append добавит элементы в существующий массив, и исходный срез изменится (его длина увеличится).
  • Если ёмкости недостаточно, append создаст новый массив, скопирует туда данные, добавит новые элементы и вернёт новый срез. В этом случае исходный срез останется без изменений.

Пример:

s := make([]int, 2, 4) // длина 2, ёмкость 4
s[0], s[1] = 1, 2
s2 := append(s, 3)      // ёмкости хватает, s и s2 указывают на один массив
fmt.Println(s)  // [1 2]
fmt.Println(s2) // [1 2 3]

s3 := append(s2, 4, 5) // ёмкости не хватает, создаётся новый массив
fmt.Println(s2) // [1 2 3]
fmt.Println(s3) // [1 2 3 4 5]

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