Ответ
В Go слайс передается по значению, но внутри содержит указатель на массив, поэтому изменения элементов будут видны вызывающей стороне. Однако изменение длины или емкости не отразится на оригинале.
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]
}
Для полного контроля над слайсом можно:
- Возвращать измененный слайс
- Передавать указатель на слайс (
*[]int) - Использовать
appendи переприсваивание в вызывающем коде
Важно помнить, что append может создать новый массив, если не хватает capacity.