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)
Salin selepas log masuk
Begini perkara yang berlaku:
- 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.
- Apabila gelung berjalan dan anda terus menambah laluan, kapasitinya akhirnya melebihi panjangnya.
- Dalam lelaran gelung berikutnya, tatasusunan sandaran baharu diperuntukkan untuk laluan. Walau bagaimanapun, laluanA dan laluanB masih merujuk kepada tatasusunan sandaran lama.
- Apabila anda menambahkan nextB pada laluan, ia menulis kepada elemen terakhir tatasusunan sandaran lama, yang dikongsi oleh kedua-dua laluanA dan laluanB.
- 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)
}
Salin selepas log masuk
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!