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

Mengapa Pembolehubah Go Ditimpa Apabila Berbilang Kepingan Dilampirkan?

Mary-Kate Olsen
Lepaskan: 2024-10-24 07:59:02
asal
275 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan