Если передать срез в функцию без указателя, повлияет ли это на исходный массив?

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Это значит, что изменения элементов среза внутри функции повлияют на исходный массив, так как оба среза указывают на один и тот же массив. Однако если внутри функции вы измените сам срез (например, присвоите новый срез или измените длину), эти изменения не повлияют на срез вне функции.

Пример:

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

func main() {
    arr := []int{1, 2, 3}
    modifySlice(arr)
    fmt.Println(arr) // Выведет [100 2 3]
}

Итого: передача среза без указателя позволяет изменять элементы исходного массива, но не позволяет изменить сам срез (его длину, указатель) вне функции.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее