Rumah >pembangunan bahagian belakang >Golang >Mengapakah kepingan yang dibuat daripada tatasusunan asas yang sama mempamerkan gelagat yang tidak dijangka apabila dilampirkan pada Go?

Mengapakah kepingan yang dibuat daripada tatasusunan asas yang sama mempamerkan gelagat yang tidak dijangka apabila dilampirkan pada Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 02:15:29914semak imbas

Why do slices created from the same underlying array exhibit unexpected behavior when appended to in Go?

Gelagat Penambahan Slice Tidak Dijangka

Dalam Go, menambahkan elemen pada kepingan dalam gelung secara tidak dijangka boleh mengubah nilai kepingan sedia ada yang dicipta daripada tatasusunan asas yang sama.

Asal Masalah

Isu ini berpunca daripada cara hirisan merujuk nilai tatasusunan asas. Apabila anda menambah pada kepingan, ia mungkin mengubah suai tatasusunan sedia ada atau mencipta yang baharu. Walau bagaimanapun, jika kepingan itu dicipta menggunakan fungsi make, ia sentiasa merujuk tatasusunan asas yang sama.

Contoh

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
}

func main() {
    sliceFromLoop()
    sliceFromLiteral()
}

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

func sliceFromLiteral() {
    i := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    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 sliceFromLoop fungsi, semua kepingan baharu (j, g, h) berkongsi tatasusunan asas yang sama seperti kepingan awal i. Ini bermakna apabila kita menambahkan kepada i, ia mengubah suai elemen terakhir semua kepingan lain.

Penyelesaian

Untuk mengelakkan tingkah laku ini, adalah disyorkan untuk membuat salinan hirisan sebelum melampirkan kepadanya. Fungsi salin memperuntukkan kepingan baharu dengan elemen yang sama seperti yang asal.

<code class="go">func sliceFromLoopFixed() {
    i := create(11)
    j := append([]int{}, i..., 100)
    g := append([]int{}, i..., 101)
    h := append([]int{}, i..., 102)
    fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h)
}</code>

Dalam kes ini, kepingan baharu j, g dan h mempunyai tatasusunan pendasarnya sendiri, jadi nilai i kekal tidak terjejas oleh lampiran.

Atas ialah kandungan terperinci Mengapakah kepingan yang dibuat daripada tatasusunan asas yang sama mempamerkan gelagat yang tidak dijangka apabila dilampirkan pada 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