Sobes.tech
Назад к вопросам
Senior
3

Что происходит, если передать slice как аргумент функции и изменить его внутри?

Компании, где спрашивали
Магнит Тех

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

sobes.tech AI

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

Если внутри функции изменить элементы слайса (например, присвоить новые значения по индексам), то эти изменения будут видны снаружи, так как у копии слайса тот же указатель на массив.

Однако если изменить сам слайс (например, сделать его длиннее с помощью append, и при этом произойдёт выделение нового массива), то эта новая копия с новым массивом не повлияет на слайс вне функции.

Пример:

func modifySlice(s []int) {
    s[0] = 100 // изменит первый элемент исходного массива
    s = append(s, 200) // создаст новый слайс, но снаружи это не отразится
}

func main() {
    s := []int{1, 2, 3}
    modifySlice(s)
    fmt.Println(s) // Выведет: [100 2 3]
}

Таким образом, изменения элементов слайса внутри функции влияют на исходный массив, а изменения самого слайса (например, расширение) — нет.