Go pembolehubah sedang ditimpa
Dalam kod ini, pengarang menghadapi isu di mana laluan pembolehubah A ditimpa semasa menetapkan laluanB. Ini menunjukkan bahawa kedua-dua pembolehubah merujuk tatasusunan asas yang sama, mengakibatkan pengubahsuaian pada satu mempengaruhi yang lain.
Isu ini berpunca daripada penggunaan fungsi append() dengan kepingan dalam Go. Apabila menambahkan elemen pada kepingan, Go menyemak sama ada tatasusunan asas mempunyai kapasiti yang mencukupi untuk menampung elemen baharu. Jika tidak, ia memperuntukkan tatasusunan yang lebih besar dan menyalin elemen sedia ada.
Dalam kod yang disediakan, laluan hirisan digunakan untuk mencipta laluanA dan laluanB. Jika kapasiti tatasusunan asas laluan melebihi apabila menambahkan sama ada pada laluanA atau laluanB, tatasusunan baharu akan diperuntukkan. Walau bagaimanapun, memandangkan kedua-dua laluanA dan laluanB berasal daripada kepingan yang sama, ia berkongsi tatasusunan asas yang sama.
Untuk mengelakkan isu ini, anda perlu membuat salinan bebas laluan sebelum menggunakannya untuk memulakan laluanA dan laluanB. Ini boleh dicapai menggunakan fungsi make() dan copy(), seperti yang ditunjukkan dalam suntingan kedua pengarang:
<code class="go">newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i])+1)*2) copy(newRoute, prePaths[i]) pathA := append(newRoute, nextA) pathB := append(prePaths[i], nextB)</code>
Dalam kod yang disemak ini, newRoute ialah kepingan berasingan dengan tatasusunan asasnya sendiri. Ini memastikan laluanA dan laluanB mempunyai salinan bebas data, menghalang pengubahsuaian kepada satu daripada menjejaskan yang lain.
Atas ialah kandungan terperinci Mengapa Pembolehubah Tetapan Satu Pergi Menggantikan Yang Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!