Sobes.tech
Middle+
18

Если передать slice в функцию и добавить в него новый элемент — будут ли изменения видны за пределами функции? Что если capacity не переполняется?

Companies where asked
X5

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.