Rumah > pembangunan bahagian belakang > Golang > Mengapa Melampirkan Pada Slice dalam Gelung Menghasilkan Keputusan Yang Tidak Dijangka dalam Go?

Mengapa Melampirkan Pada Slice dalam Gelung Menghasilkan Keputusan Yang Tidak Dijangka dalam Go?

DDD
Lepaskan: 2024-11-03 04:57:31
asal
1162 orang telah melayarinya

Why Does Appending to a Slice in a Loop Produce Unexpected Results in Go?

Gelagat Tidak Dijangka dengan Operasi Tambah pada Kepingan

Dalam Go, tingkah laku yang tidak dijangka boleh berlaku apabila menambahkan elemen pada kepingan semasa lelaran gelung dan kemudian mencipta baharu hirisan berdasarkan keputusan. Tingkah laku ini berpunca daripada tatasusunan asas yang menghiris rujukan.

Pertimbangkan kod berikut:

<code class="go">func create(iterations int) []int {
    a := make([]int, 0)
    for i := 0; i < iterations; i++ {
        a = append(a, i)
    }
    return a
}</code>
Salin selepas log masuk

Jika kita memanggil create(11) dan menyerahkan hasilnya kepada i, kami menjangkakan setiap tambahan berikutnya operasi (j := append(i, 100), g := append(i, 101), dan h := append(i, 102)) untuk mencipta kepingan baharu dengan nilai yang berbeza. Walau bagaimanapun, gelagat yang diperhatikan ialah elemen terakhir bagi kepingan baharu ini sentiasa 102, tanpa mengira indeksnya.

Ini berlaku kerana semua tambahan mengubah suai tatasusunan asas yang sama. Menambahkan elemen pada kepingan mengubah panjang dan boleh menyebabkan pengagihan semula tatasusunan. Apabila tatasusunan baharu diperuntukkan, semua rujukan terdahulu kepada tatasusunan lama menjadi tidak sah.

Slice literal, walau bagaimanapun, berkelakuan seperti yang diharapkan kerana tatasusunan baharu sentiasa diperuntukkan jika penambahan itu akan melebihi kapasiti tatasusunan sandaran.

Pendekatan Idiomatik

Untuk memastikan tingkah laku yang boleh diramal apabila mencipta berbilang kepingan baharu berdasarkan kepingan sedia ada, pendekatan idiomatik ialah menyalin kepingan sebelum menambahkan elemen:

<code class="go">func makeFromSlice(sl []int) []int {
    result := make([]int, len(sl))
    copy(result, sl)
    return result
}</code>
Salin selepas log masuk

Dengan melakukan salinan, kami mencipta tatasusunan sandaran baharu dan memastikan perubahan yang dibuat pada kepingan yang terhasil tidak menjejaskan kepingan asal.

Atas ialah kandungan terperinci Mengapa Melampirkan Pada Slice dalam Gelung Menghasilkan Keputusan Yang Tidak Dijangka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan