Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Pembolehubah Go Ditimpa?

Mengapa Pembolehubah Go Ditimpa?

Patricia Arquette
Patricia Arquetteasal
2024-10-24 07:54:30791semak imbas

Why are Go Variables Being Overwritten?

Pembolehubah Go Ditimpa

Dalam rutin Go, pengguna melaporkan isu di mana satu pembolehubah sedang ditulis ganti apabila pembolehubah lain ditetapkan. Khususnya, pengguna mencipta dua senarai integer bernama pathA dan pathB. Apabila laluanA dilanjutkan dengan nilai baharu daripada segi tiga, ia pada mulanya ditetapkan dengan betul tetapi kemudiannya ditimpa oleh laluanB.

Penyiasatan

Isu timbul disebabkan perkongsian tatasusunan sokongan antara kepingan. Dalam Go, apabila hirisan dilanjutkan melebihi kapasitinya, tatasusunan sandaran baharu diperuntukkan dan elemen sedia ada disalin ke tatasusunan baharu. Walau bagaimanapun, jika panjang hirisan kurang daripada kapasitinya, hirisan dan elemen yang dilampirkan akan berkongsi tatasusunan sandaran yang sama.

Dalam kod pengguna, apabila saiz laluanA dan laluanB berkembang, ia mencapai titik di mana panjang kepingan melebihi kapasitinya dan tatasusunan sandaran baharu telah diperuntukkan untuk laluanA. Walau bagaimanapun, sejak laluanB dicipta seterusnya, ia akhirnya menggunakan tatasusunan sandaran yang sama.

Penyelesaian

Untuk menyelesaikan isu ini, pengguna perlu memastikan bahawa kedua-dua laluanA dan pathB mempunyai tatasusunan sokongan bebas. Ini dicapai dengan memperuntukkan kepingan baharu secara manual untuk pathB menggunakan make() dan menyalin data lama menggunakan copy().

Kod Disemak

Berikut ialah kod yang diubah suai :

<code class="go">for i := 0; i < len(prePaths); i++ {
    newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i]) + 1) * 2)
    copy(newRoute, prePaths[i])

    nextA := nextLine[i]
    nextB := nextLine[i+1]

    pathA := append(newRoute, nextA)
    pathB := append(prePaths[i], nextB)

    postPaths = append(postPaths, pathA)
    postPaths = append(postPaths, pathB)
}</code>

Kod ini memastikan bahawa kedua-dua laluanA dan laluanB mempunyai tatasusunan sandaran mereka sendiri, menghalang isu timpa ganti.

Atas ialah kandungan terperinci Mengapa Pembolehubah Go Ditimpa?. 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