Sobes.tech
Назад к вопросам
Junior — Middle
87

В чем отличия при передаче массива среза (slice) в функцию через ссылку и по значению?

Ответ от нейросети

sobes.tech AI

В Go срез (slice) — это структура, которая содержит указатель на массив, длину и емкость. При передаче среза в функцию по значению копируется именно эта структура, то есть указатель, длина и емкость копируются, но не сам underlying массив.

Передача по значению:

  • Копируется структура среза (указатель, длина, емкость).
  • Изменения элементов массива внутри функции отражаются на исходном массиве, так как указатель указывает на тот же массив.
  • Изменения длины или емкости среза внутри функции не влияют на срез вне функции.

Передача по ссылке (указателю на срез):

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

Пример:

func modifySlice(s []int) {
    s[0] = 100       // изменит элемент исходного массива
    s = append(s, 200) // изменит локальную копию среза, не повлияет на внешний срез
}

func modifySlicePtr(s *[]int) {
    (*s)[0] = 100
    *s = append(*s, 200) // изменит внешний срез
}

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

    modifySlicePtr(&s)
    fmt.Println(s) // [100 2 3 200]
}

Таким образом, если нужно изменить длину или емкость среза внутри функции и чтобы изменения были видны снаружи, передают указатель на срез. Если достаточно изменить только элементы, можно передавать срез по значению.