Назад к вопросам
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]
Таким образом, исходный срез изменяется, если ёмкости хватает, иначе создаётся новый срез.