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" adengan panjang 10. Kemudian kita membuat xirisan tujuan dengan mengiris aarray ini , yirisan dibuat menggunakan literal komposit []int{3, 4}. Sekarang ketika kita menambahkan yuntuk x, hasilnya adalah diharapkan [1 2 3 4], tapi apa yang mungkin mengejutkan adalah bahwa array dukungan ajuga berubah, karena kapasitas xyaitu 10yang cukup untuk menambahkan yuntuk itu, jadi xini resliced yang juga akan menggunakan yang sama aberbagai dukungan, dan append()akan menyalin elemen yke 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 xseperti 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 xhasil yang sama tetapi array backing atidak 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 xdan y, yang berbeda dari a.
append()fungsi variadic, dan...memungkinkan Anda melewati beberapa argumen ke fungsi variadic dari slice.