Sobes.tech
Назад к вопросам
Middle+
7

Как работает append? Что будет, если передать slice в функцию и изменить его?

Компании, где спрашивали
Бюро 1440Бюро 1440

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

sobes.tech AI

В Go функция append используется для добавления элементов в срез (slice). Она принимает срез и новые элементы, возвращая новый срез, который может указывать на ту же или новую underlying array.

Если у среза хватает ёмкости (capacity), append добавит элементы в существующий массив, и исходный срез изменится, так как они разделяют память. Если ёмкости недостаточно, append создаст новый массив, скопирует данные и вернёт новый срез.

При передаче среза в функцию передаётся копия структуры среза (указатель на массив, длина, ёмкость), но не копия самого массива. Изменения элементов среза внутри функции повлияют на исходный массив, так как указатель тот же. Однако, если внутри функции сделать append, который приводит к выделению нового массива, то изменения снаружи не отразятся.

Пример:

func modify(slice []int) {
    slice[0] = 100 // изменит исходный массив
    slice = append(slice, 200) // возможно создаст новый массив
    slice[1] = 300 // изменит новый массив, не исходный
}

s := []int{1, 2}
modify(s)
fmt.Println(s) // Выведет [100 2], т.к. изменение первого элемента повлияло, а append внутри функции не изменил исходный срез