Я думаю, що важливо вказати і знати, що якщо фрагмент призначення (фрагмент, який ви додаєте) має достатню ємність, додавання відбудеться "на місці", зменшивши місце призначення (зменшивши його, щоб збільшити його довжину, щоб бути вміє вмістити придатні елементи).
Це означає, що якщо призначення було створене шляхом нарізання більшого масиву або фрагмента, який містить додаткові елементи, що перевищують довжину отриманого фрагмента, вони можуть бути перезаписані.
Для демонстрації див. Цей приклад:
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також змінився, тому що здатність xIS , 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()варіатична функція, і...дозволяє передати декілька аргументів на різноманітну функцію з фрагмента.