Rumah >pembangunan bahagian belakang >Golang >Mengapa Slice Append Kelakuan Berubah Apabila Mencipta Slice Baharu daripada Gelung?

Mengapa Slice Append Kelakuan Berubah Apabila Mencipta Slice Baharu daripada Gelung?

DDD
DDDasal
2024-11-03 12:46:31561semak imbas

Why Does Slice Append Behavior Change When Creating New Slices from a Loop?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn