Sobes.tech
Назад к вопросам
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]
}

Итого:

  • Изменения элементов слайса внутри функции видны снаружи.
  • Изменения структуры слайса (длина, ёмкость) без передачи указателя не видны снаружи.
  • Для изменения длины слайса снаружи передавайте указатель на слайс.