Saya pikir sangat penting untuk menunjukkan dan mengetahui bahwa jika irisan tujuan (irisan yang Anda tambahkan) memiliki kapasitas yang cukup, append akan terjadi "di tempat", dengan reslicing tujuan (reslicing untuk menambah panjangnya agar menjadi mampu mengakomodasi elemen-elemen yang dapat ditambahkan).
Ini berarti bahwa jika tujuan dibuat dengan mengiris array atau irisan yang lebih besar yang memiliki elemen tambahan di luar panjang irisan yang dihasilkan, mereka mungkin akan ditimpa.
Untuk menunjukkan, lihat contoh ini:
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)
Output (coba di Go Playground ):
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]
Kami membuat array "dukungan" a
dengan panjang 10
. Kemudian kita membuat x
irisan tujuan dengan mengiris a
array ini , y
irisan dibuat menggunakan literal komposit []int{3, 4}
. Sekarang ketika kita menambahkan y
untuk x
, hasilnya adalah diharapkan [1 2 3 4]
, tapi apa yang mungkin mengejutkan adalah bahwa array dukungan a
juga berubah, karena kapasitas x
yaitu 10
yang cukup untuk menambahkan y
untuk itu, jadi x
ini resliced yang juga akan menggunakan yang sama a
berbagai dukungan, dan append()
akan menyalin elemen y
ke sana.
Jika Anda ingin menghindari ini, Anda dapat menggunakan ekspresi irisan penuh yang memiliki formulir
a[low : high : max]
yang membangun slice dan juga mengontrol kapasitas slice yang dihasilkan dengan mengaturnya max - low
.
Lihat contoh yang dimodifikasi (satu-satunya perbedaan yang kita buat x
seperti ini 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)
Output (coba di Go Playground )
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]
Seperti yang Anda lihat, kami mendapatkan x
hasil yang sama tetapi array backing a
tidak berubah, karena kapasitas x
"hanya" 2
(terima kasih kepada ekspresi irisan penuh a[:2:2]
). Jadi untuk melakukan append, array backing baru dialokasikan yang dapat menyimpan elemen keduanya x
dan y
, yang berbeda dari a
.
append()
fungsi variadic, dan...
memungkinkan Anda melewati beberapa argumen ke fungsi variadic dari slice.