Я думаю, що важливо вказати і знати, що якщо фрагмент призначення (фрагмент, який ви додаєте) має достатню ємність, додавання відбудеться "на місці", зменшивши місце призначення (зменшивши його, щоб збільшити його довжину, щоб бути вміє вмістити придатні елементи).
Це означає, що якщо призначення було створене шляхом нарізання більшого масиву або фрагмента, який містить додаткові елементи, що перевищують довжину отриманого фрагмента, вони можуть бути перезаписані.
Для демонстрації див. Цей приклад:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Результат (спробуйте на майданчику Go ):
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 10
x: [1 2 3 4]
a: [1 2 3 4 0 0 0 0 0 0]
Ми створили масив "backing" a
з довжиною 10
. Потім ми створюємо x
цільовий зріз, розрізаючи цей a
масив, y
фрагмент створюється за допомогою складеного літералу []int{3, 4}
. Тепер , коли ми додаємо y
до x
, результат є очікуваним [1 2 3 4]
, але то , що може бути дивного в тому , що масив підтримка a
також змінився, тому що здатність x
IS , 10
яка достатня для додавання y
до нього, так x
як resliced , який також буде використовувати той же a
масив підкладковий і append()
буде копіювати елементи y
туди.
Якщо ви хочете цього уникнути, ви можете використовувати вираз із повним фрагментом, який має форму
a[low : high : max]
який створює фрагмент, а також контролює ємність отриманого фрагмента, встановлюючи його max - low
.
Дивіться модифікований приклад (різниця полягає лише в тому, що ми створюємо x
так x = a[:2:2]
::
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Вихід (спробуйте на майданчику Go )
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 2
x: [1 2 3 4]
a: [1 2 0 0 0 0 0 0 0 0]
Як бачимо, ми отримуємо той самий x
результат, але резервний масив a
не змінився, оскільки ємність x
"лише" 2
(завдяки висловленню повного фрагмента a[:2:2]
). Щоб зробити додавання, виділяється новий резервний масив, який може зберігати елементи як x
і y
, від чого відрізняється a
.
append()
варіатична функція, і...
дозволяє передати декілька аргументів на різноманітну функцію з фрагмента.