Rumah > Artikel > pembangunan bahagian belakang > Mengapa Mengubah Suai Salinan Go Slice Juga Mengubah Yang Asal?
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:
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!