Dalam Go, menambahkan elemen pada kepingan dalam gelung secara tidak dijangka boleh mengubah nilai kepingan sedia ada yang dicipta daripada tatasusunan asas yang sama.
Isu ini berpunca daripada cara hirisan merujuk nilai tatasusunan asas. Apabila anda menambah pada kepingan, ia mungkin mengubah suai tatasusunan sedia ada atau mencipta yang baharu. Walau bagaimanapun, jika kepingan itu dicipta menggunakan fungsi make, ia sentiasa merujuk tatasusunan asas yang sama.
Pertimbangkan kod berikut:
<code class="go">func create(iterations int) []int { a := make([]int, 0) for i := 0; i < iterations; i++ { a = append(a, i) } return a } func main() { sliceFromLoop() sliceFromLiteral() } func sliceFromLoop() { i := create(11) j := append(i, 100) g := append(i, 101) h := append(i, 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) } func sliceFromLiteral() { i := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} j := append(i, 100) g := append(i, 101) h := append(i, 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) }</code>
Dalam sliceFromLoop fungsi, semua kepingan baharu (j, g, h) berkongsi tatasusunan asas yang sama seperti kepingan awal i. Ini bermakna apabila kita menambahkan kepada i, ia mengubah suai elemen terakhir semua kepingan lain.
Untuk mengelakkan tingkah laku ini, adalah disyorkan untuk membuat salinan hirisan sebelum melampirkan kepadanya. Fungsi salin memperuntukkan kepingan baharu dengan elemen yang sama seperti yang asal.
<code class="go">func sliceFromLoopFixed() { i := create(11) j := append([]int{}, i..., 100) g := append([]int{}, i..., 101) h := append([]int{}, i..., 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) }</code>
Dalam kes ini, kepingan baharu j, g dan h mempunyai tatasusunan pendasarnya sendiri, jadi nilai i kekal tidak terjejas oleh lampiran.
Atas ialah kandungan terperinci Mengapakah kepingan yang dibuat daripada tatasusunan asas yang sama mempamerkan gelagat yang tidak dijangka apabila dilampirkan pada Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!