Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Penambahan pada Slice dalam Gelung Mempengaruhi Slice Lain dalam Go?

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

Barbara Streisand
Barbara Streisandasal
2024-11-06 04:05:02962semak imbas

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>

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>

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>

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!

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