Назад к вопросам
Senior
3
Можем ли мы передать слайс как параметр внутрь функции? Есть ли какие-то нюансы в такой передаче?
Компании, где спрашивали
Магнум
Ответ от нейросети
sobes.tech AI
Да, в Go можно передавать слайс как параметр функции. При этом важно понимать, что слайс — это структура, содержащая указатель на массив, длину и ёмкость.
При передаче слайса в функцию копируется именно эта структура (header), а не весь массив данных. Поэтому внутри функции можно изменять элементы массива через слайс, и эти изменения будут видны снаружи.
Однако, если внутри функции изменить сам слайс (например, сделать 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]
}
Если нужно, чтобы изменения слайса (например, расширение) были видны снаружи, можно передавать указатель на слайс:
func modifySlicePtr(s *[]int) {
*s = append(*s, 200) // изменит слайс снаружи
}
func main() {
s := []int{1, 2, 3}
modifySlicePtr(&s)
fmt.Println(s) // Выведет: [1 2 3 200]
}
Итого:
- Изменения элементов слайса внутри функции видны снаружи.
- Изменения структуры слайса (длина, ёмкость) без передачи указателя не видны снаружи.
- Для изменения длины слайса снаружи передавайте указатель на слайс.