Mengapa Penambahan pada Slice dalam Gelung Mempengaruhi Slice Lain dalam Go?

Barbara Streisand
Lepaskan: 2024-11-06 04:05:02
asal
978 orang telah melayarinya

Why Does Appending to a Slice in a Loop Affect Other Slices in Go?

Gelagat Tidak Dijangka dalam Slice Append: Cara Mencipta Berbilang Slice Tanpa Kebimbangan Pengubahsuaian

Apabila memanipulasi kepingan dalam kod Go, anda mungkin menghadapi masalah yang membingungkan isu: menambahkan elemen pada hirisan dalam gelung dan kemudian menggunakan hasil gelung untuk mencipta hirisan baharu boleh menyebabkan lampiran terakhir mengatasi hirisan daripada lampiran sebelumnya. Tingkah laku ini timbul kerana kepingan merujuk kepada nilai tatasusunan asas yang sama.

Contoh:

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

func sliceFromLoop() {
    i := create(11)
    j := append(i, 100)
    g := append(i, 101)
    h := append(i, 102)
    fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h)
}</code>
Salin selepas log masuk

Dalam contoh ini, fungsi sliceFromLoop mencipta kepingan i dan menambahkan yang berbeza nilai kepadanya, menghasilkan kepingan j, g, dan h. Walau bagaimanapun, ketiga-tiga hirisan menghala ke tatasusunan asas yang sama, jadi apabila lampiran terakhir mengubah suai tatasusunan, ia memberi kesan kepada semua hirisan.

Penyelesaian: Menyalin Slices untuk Pengubahsuaian Bebas

Cara idiomatik untuk membuat berbilang kepingan berdasarkan kepingan sedia ada dan mengelakkan kebimbangan pengubahsuaian adalah dengan menyalin kepingan sebelum menambahkan apa-apa. Ini memastikan setiap kepingan baharu mempunyai tatasusunan pendasarnya sendiri.

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

Contoh Penggunaan:

<code class="go">func main() {
    i := make([]int, 0)
    for ii := 0; ii < 11; ii++ {
        i = append(i, ii)
    }
    j := append(makeFromSlice(i), 100) // works fine
}</code>
Salin selepas log masuk

Dalam contoh yang disemak ini, kami mencipta salinan saya potong sebelum tambahkan 100 kepadanya. Ini memastikan bahawa j merujuk tatasusunan asas yang berasingan dan tidak akan terjejas oleh pengubahsuaian masa hadapan untuk i.

Penjelasan Slice Gelagat Literal

Sebab isu ini berlaku tidak timbul dengan literal hirisan (cth., i := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) ialah tatasusunan baharu diperuntukkan jika operasi tambah akan melebihi kapasiti tatasusunan sokongan. Tingkah laku ini tidak berkaitan dengan huruf hirisan dan merupakan sifat asas untuk menambahkan hirisan.

Atas ialah kandungan terperinci Mengapa Penambahan pada Slice dalam Gelung Mempengaruhi Slice Lain 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!