Gelagat Penambahan Slice Tidak Dijangka
Pengenalan Isu
Apabila menambahkan elemen pada kepingan dalam gelung, percubaan seterusnya untuk mencipta kepingan baharu daripada hasil gelung mempamerkan tingkah laku yang tidak dijangka. Khususnya, elemen tambahan terakhir menimpa hasil lampiran sebelumnya. Isu ini timbul apabila mencipta kepingan baharu berdasarkan kepingan yang diperoleh daripada lelaran gelung.
Analisis
Tingkah laku yang diperhatikan berpunca daripada fakta bahawa kedua-dua kepingan Go dan tatasusunan menggunakan struktur data asas yang sama. Apabila menambahkan pada kepingan, Go mencipta objek kepingan baharu yang merujuk tatasusunan asas yang sama. Ini bermakna sebarang perubahan yang dibuat pada kepingan asal juga akan menjejaskan kepingan baharu.
Penyelesaian
Untuk mengelakkan tingkah laku ini, adalah penting untuk menyalin kepingan sebelum membuat sebarang pengubahsuaian. Ini mencipta objek hirisan baharu yang mempunyai rujukan bebasnya sendiri kepada tatasusunan asas. Cara idiomatik untuk mencapai ini ialah menggunakan fungsi salin:
<code class="go">func makeFromSlice(sl []int) []int { result := make([]int, len(sl)) copy(result, sl) return result }</code>
Dengan memberikan hasil makeFromSlice(i) kepada j dalam fungsi utama, kami mencipta kepingan baharu yang bebas daripada i asal. hirisan. Potongan baharu ini boleh diubah suai dengan selamat tanpa menjejaskan yang asal.
Berbeza dengan Slice Literal
Slice literals, seperti {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, sentiasa memperuntukkan tatasusunan asas baharu apabila ditambah melebihi kapasitinya. Ini menerangkan sebab sliceFromLiteral berkelakuan seperti yang diharapkan.
Kesimpulan
Apabila bekerja dengan kepingan, sentiasa ingat untuk membuat salinan sebelum mengubah suainya. Ini memastikan bahawa perubahan yang dibuat pada kepingan baharu tidak menjejaskan kepingan asal. Fungsi salin menyediakan cara yang idiomatik dan cekap untuk melakukan ini.
Atas ialah kandungan terperinci Mengapa Slice Append Kelakuan Berubah Apabila Mencipta Slice Baharu daripada Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!