Ответ
В 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 были видны, нужно передавать указатель на слайс или возвращать новый слайс.