Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Mengubah Suai Salinan Go Slice Juga Mengubah Yang Asal?

Mengapa Mengubah Suai Salinan Go Slice Juga Mengubah Yang Asal?

Barbara Streisand
Barbara Streisandasal
2024-11-19 06:44:02226semak imbas

Why Does Modifying a Go Slice Copy Also Change the Original?

Memahami Pengubahsuaian Slice dalam Go

Dalam Go, pembolehubah slice berkelakuan berbeza daripada tatasusunan biasa. Ini boleh membawa kepada tingkah laku yang tidak dijangka, terutamanya apabila mengubah suai kepingan.

Misteri Perubahan Slice Asal

Pertimbangkan kod berikut:

import "fmt"

func main() {
    A := []int{3, 4, 5, 3, 7}

    fmt.Println("Initial slice: ", A)
    funcSome(A)
    fmt.Println("Modified slice: ", A)
}

func funcSome(slice []int) {
    fmt.Println("Inside function, original slice: ", slice)
    temp := slice // copy by value

    temp[0] = 10
    fmt.Println("Inside function, modified temp: ", temp)
    fmt.Println("Inside function, original slice: ", slice)
}

Apabila anda menjalankan kod ini, anda mungkin terkejut mendapati bahawa mengubah suai hirisan sementara, temp, juga mengubah suai hirisan asal, A.

Memahami Dalaman Slice

Untuk memahami tingkah laku ini, kita perlu menyelami struktur dalaman kepingan. Pembolehubah hirisan terdiri daripada tiga komponen:

  • Penunjuk: Menuding pada tatasusunan sandaran yang menyimpan data
  • Panjang: Bilangan elemen dalam hirisan
  • Kapasiti: Kapasiti maksimum kepingan

Apabila anda menetapkan kepingan kepada pembolehubah baharu mengikut nilai, seperti yang kita lakukan dengan temp := slice, anda sedang mencipta salinan cetek. Ini bermakna kepingan baharu (temp) berkongsi tatasusunan dan penuding sokongan yang sama seperti kepingan asal (hirisan).

Dilema apend()

Apend( ) dalam Go menambah elemen pada kepingan dengan mencipta tatasusunan sandaran baharu dan menyalin data sedia ada ke dalamnya. Walau bagaimanapun, jika kepingan baharu mempunyai kapasiti yang tidak mencukupi, fungsi append() akan meningkatkan kapasiti secara automatik dengan memperuntukkan semula tatasusunan sandaran yang lebih besar.

Dalam contoh anda, fungsi remove() menggunakan append() untuk mencipta yang baharu hirisan. Memandangkan temp dan A berkongsi tatasusunan sandaran yang sama, sebarang pengubahsuaian pada kepingan baharu juga akan menjejaskan kepingan asal.

Kesimpulan

Memahami pengubahsuaian kepingan dalam Go memerlukan kebiasaan dengan struktur dalaman yang unik. Ingat bahawa apabila menyalin kepingan mengikut nilai, anda mencipta salinan cetek, yang berkongsi tatasusunan sokongan yang sama. Tingkah laku ini boleh membawa kepada akibat yang tidak dijangka apabila mengubah suai kepingan.

Atas ialah kandungan terperinci Mengapa Mengubah Suai Salinan Go Slice Juga Mengubah Yang Asal?. 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