Назад к вопросам
Junior
144
questionbank

Как работает функция append для срезов в Go?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Функция append добавляет элементы к срезу. Она возвращает новый срез, поскольку исходный может быть изменен.

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

Если вместимости недостаточно, append выделяет новый, более крупный базовый массив, копирует туда элементы из исходного среза и добавляет новые. Новый срез будет указывать на этот новый массив.

Как правило, размер нового массива удваивается при недостатке вместимости, чтобы минимизировать количество будущих перераспределений.

// Пример использования append
slice1 := []int{1, 2, 3}
fmt.Printf("Slice1: %v, Len: %d, Cap: %d\n", slice1, len(slice1), cap(slice1)) // Output: Slice1: [1 2 3], Len: 3, Cap: 3

// Добавление одного элемента - capacity хватает
slice2 := append(slice1, 4)
fmt.Printf("Slice2: %v, Len: %d, Cap: %d\n", slice2, len(slice2), cap(slice2)) // Output: Slice2: [1 2 3 4], Len: 4, Cap: 6 (capacity удвоилась)

// Добавление нескольких элементов
slice3 := append(slice2, 5, 6, 7)
fmt.Printf("Slice3: %v, Len: %d, Cap: %d\n", slice3, len(slice3), cap(slice3)) // Output: Slice3: [1 2 3 4 5 6 7], Len: 7, Cap: 12 (capacity снова удвоилась)

// Добавление элементов из другого среза с помощью многоточия ...
slice4 := []int{8, 9}
slice5 := append(slice3, slice4...)
fmt.Printf("Slice5: %v, Len: %d, Cap: %d\n", slice5, len(slice5), cap(slice5)) // Output: Slice5: [1 2 3 4 5 6 7 8 9], Len: 9, Cap: 12