Gelagat Tidak Dijangka dengan Operasi Tambah pada Kepingan
Dalam Go, tingkah laku yang tidak dijangka boleh berlaku apabila menambahkan elemen pada kepingan semasa lelaran gelung dan kemudian mencipta baharu hirisan berdasarkan keputusan. Tingkah laku ini berpunca daripada tatasusunan asas yang menghiris rujukan.
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 }</code>
Jika kita memanggil create(11) dan menyerahkan hasilnya kepada i, kami menjangkakan setiap tambahan berikutnya operasi (j := append(i, 100), g := append(i, 101), dan h := append(i, 102)) untuk mencipta kepingan baharu dengan nilai yang berbeza. Walau bagaimanapun, gelagat yang diperhatikan ialah elemen terakhir bagi kepingan baharu ini sentiasa 102, tanpa mengira indeksnya.
Ini berlaku kerana semua tambahan mengubah suai tatasusunan asas yang sama. Menambahkan elemen pada kepingan mengubah panjang dan boleh menyebabkan pengagihan semula tatasusunan. Apabila tatasusunan baharu diperuntukkan, semua rujukan terdahulu kepada tatasusunan lama menjadi tidak sah.
Slice literal, walau bagaimanapun, berkelakuan seperti yang diharapkan kerana tatasusunan baharu sentiasa diperuntukkan jika penambahan itu akan melebihi kapasiti tatasusunan sandaran.
Pendekatan Idiomatik
Untuk memastikan tingkah laku yang boleh diramal apabila mencipta berbilang kepingan baharu berdasarkan kepingan sedia ada, pendekatan idiomatik ialah menyalin kepingan sebelum menambahkan elemen:
<code class="go">func makeFromSlice(sl []int) []int { result := make([]int, len(sl)) copy(result, sl) return result }</code>
Dengan melakukan salinan, kami mencipta tatasusunan sandaran baharu dan memastikan perubahan yang dibuat pada kepingan yang terhasil tidak menjejaskan kepingan asal.
Atas ialah kandungan terperinci Mengapa Melampirkan Pada Slice dalam Gelung Menghasilkan Keputusan Yang Tidak Dijangka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!