Penerangan Masalah:
Pertimbangkan kod Go berikut:
func main() { slice := make([]int, 10, 10) slice[0] = 0 slice[1] = 1 slice1 := slice slice1[0] = 10000 fmt.Println(slice) slice1 = append(slice1, 100) slice1[0] = 20000 fmt.Println(slice) }
Keluaran awal adalah seperti yang dijangkakan: kedua-dua slice dan slice1 menunjukkan nilai yang sama. Walau bagaimanapun, selepas operasi tambah pada slice1, nilai slice kekal tidak berubah. Tingkah laku ini kelihatan berlawanan dengan intuisi, memandangkan andaian bahawa kepingan adalah penunjuk.
Penjelasan:
Fungsi tambah tidak mengubah suai kepingan1. Go melepasi semua nilai mengikut nilai, jadi slice1 menerima salinan slice. Operasi tambah mencipta tatasusunan baharu, memandangkan tatasusunan asal telah mencapai kapasitinya. Ia kemudian menyalin kandungan tatasusunan lama ke dalam tatasusunan baharu dan mengembalikan pengepala hirisan baharu yang menghala ke tatasusunan baharu.
Penugasan nilai pulangan kepada slice1 mengubah slice1. Walau bagaimanapun, slice kekal tidak terjejas kerana ia adalah pembolehubah berasingan yang menunjuk kepada tatasusunan asal. Oleh itu, sebarang perubahan yang dibuat pada elemen slice1 atau slice selepas operasi tambah tidak akan ditunjukkan dalam yang lain.
Ringkasnya, kepingan dalam Go ialah nilai pas-demi-dan tambah mencipta kepingan baharu dengan baharu tatasusunan asas apabila perlu. Ini bermakna perubahan yang dibuat pada satu kepingan tidak ditunjukkan dalam kepingan lain yang menunjuk kepada tatasusunan asal.
Atas ialah kandungan terperinci Mengapakah Penambahan pada Go Slice Tidak Mempengaruhi Slice Lain yang Menunjuk pada Tatasusunan Dasar yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!