Назад к вопросам
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]
}
Таким образом, если нужно изменить длину или емкость среза внутри функции и чтобы изменения были видны снаружи, передают указатель на срез. Если достаточно изменить только элементы, можно передавать срез по значению.