Если передать slice в функцию и добавить в него новый элемент — будут ли изменения видны за пределами функции? Что если capacity не переполняется?
Answer from AI
sobes.tech AI
В Go срез (slice) — это структура, содержащая указатель на массив, длину и емкость.
Если передать срез в функцию и добавить в него новый элемент с помощью append, поведение зависит от текущей емкости (capacity):
-
Если емкость не переполняется:
appendдобавит элемент в существующий массив, на который указывает срез. В этом случае изменения будут видны за пределами функции, так как underlying array общий. -
Если емкость переполняется:
appendсоздаст новый массив с увеличенной емкостью, скопирует туда данные и вернет новый срез. Внутри функции будет новый срез, но за пределами функции исходный срез останется без изменений, если не присвоить результатappendобратно.
Пример:
func addElement(s []int) {
s = append(s, 10) // если capacity не переполнена, добавит в тот же массив
}
func main() {
s := make([]int, 0, 5) // capacity 5
addElement(s)
fmt.Println(s) // [] — изменений нет, т.к. append вернул новый срез, но мы его не сохранили
s = append(s, 1, 2, 3)
s = append(s, 4) // capacity не переполнена
addElement(s)
fmt.Println(s) // [1 2 3 4 10] — изменения видны
}
Итого: чтобы изменения были видны за пределами функции, нужно либо гарантировать, что емкость не переполнится, либо возвращать и присваивать результат append.