Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Pembolehubah Go Ditimpa Apabila Berbilang Kepingan Dilampirkan?

Mengapa Pembolehubah Go Ditimpa Apabila Berbilang Kepingan Dilampirkan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-24 07:59:02191semak imbas

Why Are Go Variables Overwritten When Multiple Slices Are Appended?

Pergi Pembolehubah Ditimpa (Pepijat?)

Isu ini berlaku apabila menetapkan berbilang pembolehubah, setiap satu ditakrifkan dengan menambahkan elemen pada kepingan sedia ada , tetapi satu pembolehubah ditimpa apabila yang kedua ditetapkan.

Pertimbangkan coretan kod berikut:

<code class="go">for i := 0; i < len(prePaths); i++ {
    route := prePaths[i]
    nextA := nextLine[i]
    nextB := nextLine[i+1]

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

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

Masalahnya terletak pada baris kedua gelung, di mana kedua-dua 'pathA' dan 'pathB' ditakrifkan sebagai kepingan yang dilampirkan dengan elemen. Walau bagaimanapun, penambahan pada kepingan tidak menghasilkan kepingan baharu; sebaliknya, ia mengubah suai kepingan sedia ada.

Dalam senario ini, 'laluan' ialah kepingan sedia ada yang dilampirkan. Oleh itu, apabila 'pathA' dicipta, ia berkongsi tatasusunan asas yang sama seperti 'laluan'. Selepas itu, apabila 'pathB' dicipta, ia juga berkongsi tatasusunan yang sama seperti 'pathA'.

Memandangkan 'pathB' ialah kepingan terakhir yang dilampirkan, elemen terakhir dalam tatasusunan asas ditetapkan kepada nilai yang dilampirkan ke 'pathB'. Akibatnya, 'pathA', yang berkongsi tatasusunan yang sama, juga mencerminkan perubahan ini. Ini menerangkan sebab 'pathA' ditimpa apabila 'pathB' ditetapkan.

Untuk menyelesaikan isu ini, seseorang mesti mencipta kepingan bebas untuk 'pathA' dan 'pathB'. Ini boleh dicapai dengan menggunakan fungsi 'buat' dan 'salin'.

Berikut ialah coretan kod yang diubah suai yang mencipta kepingan bebas:

<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>

Dalam kod ini, 'newRoute' ialah kepingan baharu yang dibuat menggunakan fungsi 'make', memastikan ia mempunyai data bebas. Fungsi 'salinan' kemudiannya digunakan untuk menyalin data daripada 'prePaths[i]' ke dalam kepingan baharu 'newRoute'. Selepas itu, 'pathA' dan 'pathB' ditakrifkan menggunakan kepingan bebas, menyelesaikan isu awal.

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