Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Penukaran Pembolehubah Berlaku dalam Go Apabila Dilampirkan pada Slices daripada Tatasusunan yang Sama?

Mengapa Penukaran Pembolehubah Berlaku dalam Go Apabila Dilampirkan pada Slices daripada Tatasusunan yang Sama?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-24 08:11:01385semak imbas

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

Punca Penimpaan Pembolehubah dalam Go

Kod anda menghadapi isu penggantian pembolehubah kerana anda mencipta kepingan baharu (pathA dan pathB) dengan menambahkan elemen pada tatasusunan sandaran yang sama (laluan) dalam satu gelung.

Latar Belakang pada Slices dalam Go:

  • Kepingan Go ialah struktur data yang mewakili blok bersebelahan unsur-unsur jenis yang sama.
  • Kepingan mempunyai panjang (bilangan elemen yang disimpan pada masa ini) dan kapasiti (bilangan maksimum elemen yang boleh disimpannya).
  • Apabila anda mengubah suai kepingan, ia mungkin mencetuskan peruntukan tatasusunan sandaran baharu jika kapasiti melebihi.

Masalah dengan Kod Anda:

Dalam kod anda, anda sedang mencipta dua kepingan baharu, laluanA dan laluanB, menggunakan fungsi tambah:

pathA := append(route, nextA)
pathB := append(route, nextB)

Begini perkara yang berlaku:

  1. Pada mulanya, laluan mempunyai kapasiti yang boleh memuatkan kedua-dua nextA dan nextB. Jadi, dua hirisan baharu (pathA dan pathB) dicipta dengan tatasusunan sandaran yang sama seperti laluan.
  2. Apabila gelung berjalan dan anda terus menambah laluan, kapasitinya akhirnya melebihi panjangnya.
  3. Dalam lelaran gelung berikutnya, tatasusunan sandaran baharu diperuntukkan untuk laluan. Walau bagaimanapun, laluanA dan laluanB masih merujuk kepada tatasusunan sandaran lama.
  4. Apabila anda menambahkan nextB pada laluan, ia menulis kepada elemen terakhir tatasusunan sandaran lama, yang dikongsi oleh kedua-dua laluanA dan laluanB.
  5. Akibatnya, kedua-dua laluanA dan laluanB berakhir dengan nilai akhir yang sama.

Penyelesaian:

Untuk mengelakkan tiruan ini, anda perlu pastikan laluanA dan laluanB mempunyai tatasusunan sandaran yang unik. Anda boleh mencapai ini dengan membuat kepingan baharu secara manual untuk salah satu daripadanya menggunakan make dan copy:

newRoute := make([]int, len(route), (cap(route)+1)*2)
copy(newRoute, route)
if i % 2 == 0 {
    pathA := append(newRoute, nextA)
} else {
    pathB := append(newRoute, nextB)
}

Atas ialah kandungan terperinci Mengapa Penukaran Pembolehubah Berlaku dalam Go Apabila Dilampirkan pada Slices daripada Tatasusunan yang Sama?. 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