Как слайс передается в функцию в качестве аргумента

«Как слайс передается в функцию в качестве аргумента» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

func modifySlice(s []int) {
    s[0] = 100  // изменит оригинальный слайс
    s = append(s, 200)  // не изменит оригинальный слайс
}

func main() {
    slice := []int{1, 2, 3}
    modifySlice(slice)
    fmt.Println(slice) // [100 2 3]
}

Чтобы изменения append были видны, нужно передавать указатель на слайс или возвращать новый слайс.