Что происходит, если передать slice как аргумент функции и изменить его внутри?
Answer from AI
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]
}
Таким образом, изменения элементов слайса внутри функции влияют на исходный массив, а изменения самого слайса (например, расширение) — нет.