Bertentangan dengan dokumentasi API terbina dalam, fungsi append() tidak selalu mencipta kepingan baharu . Ini ditentukan oleh kapasiti kepingan asal dan bilangan elemen yang akan ditambah.
Dalam coretan kod yang disediakan, tempat gabungan boolean dicipta secara rekursif, tanda seru menunjukkan kepingan yang dihantar ke saluran daripada fungsi AddOption. Walau bagaimanapun, kepingan yang muncul di bahagian lain dalam main() diubah suai.
Kekeliruan timbul daripada perbezaan antara jenis data kepingan dan perwakilan dalamannya. Deskriptor hirisan terdiri daripada dua integer (panjang dan kapasiti) dan penunjuk kepada data asas. Oleh itu, append() mengembalikan kepingan baharu dengan deskriptor baharu tetapi penunjuk yang sama kepada data.
Ini digambarkan dalam contoh kod berikut:
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) // Create a slice with zero length and capacity 5 s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(a) b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(b) fmt.Println(a) }</code>
Output:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6]
Ini menunjukkan bahawa kedua-dua a dan b berkongsi penuding data yang sama kerana kepingan asal masih mempunyai kapasiti. Walau bagaimanapun, jika kita mengurangkan kapasiti kepada 4:
<code class="go">s := make([]int, 0, 4)</code>
Output menjadi:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5]
Memandangkan kepingan asal tidak lagi mempunyai kapasiti yang mencukupi, append() mencipta kepingan baharu dengan penunjuk data baharu untuk b.
Atas ialah kandungan terperinci Bilakah Fungsi `append()` Golang Memperuntukkan Slice Baharu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!