Dalam Go, adalah amalan biasa untuk menemui kod seperti ini:
<code class="go">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) }</code>
Setelah dijalankan kod ini, anda akan melihat sesuatu yang pelik:
[10000 1 0 0 0 0 0 0 0 0] [10000 1 0 0 0 0 0 0 0 0]
Secara intuitif, seseorang mungkin menganggap bahawa slice dan slice1 adalah rujukan kepada tatasusunan asas yang sama. Walau bagaimanapun, pemerhatian ini menimbulkan persoalan: mengapa slice kekal tidak berubah selepas operasi tambah pada slice1?
Memahami Sifat Kepingan
Untuk membongkar misteri ini, adalah penting untuk memahami sifat asas kepingan dalam Go. Kepingan bukan penunjuk; ia adalah enkapsulasi tatasusunan. Khususnya, sekeping terdiri daripada tiga elemen:
Apabila menetapkan slice1 untuk slice, anda sedang mencipta pengepala slice baharu yang menghala ke tatasusunan asas yang sama seperti slice. Akibatnya, sebarang pengubahsuaian yang dibuat pada slice1 dicerminkan secara langsung dalam slice.
Kesan append()
Sekarang, mari kita analisa kesan append() pada keping1. Fungsi append() mengambil kepingan sebagai hujah dan mengembalikan kepingan baharu. Potongan baharu ini mungkin atau mungkin tidak merujuk kepada tatasusunan asas yang sama seperti kepingan asal.
Dalam kes ini, memandangkan kepingan pada mulanya mempunyai kapasiti yang sama dengan panjangnya, mana-mana operasi append() dengan lebih daripada 0 elemen memerlukan mencipta tatasusunan baharu yang lebih besar. Inilah yang dilakukan slice1 = append(slice1, 100). Ia memperuntukkan tatasusunan baharu, menyalin kandungan yang lama dan mengembalikan pengepala kepingan baharu.
Penugasan pengepala kepingan yang terhasil kepada slice1 menggantikan pengepala kepingan sebelumnya dalam slice1. Ini bermakna slice1 kini menunjuk kepada tatasusunan asas yang berbeza daripada slice. Akibatnya, sebarang pengubahsuaian seterusnya yang dibuat kepada slice1 tidak menjejaskan slice, dan begitu juga sebaliknya.
Kesimpulan
Walaupun kepingan biasanya disalah anggap sebagai penunjuk, ia sebenarnya adalah nilai yang berbeza. jenis. Perbezaan intrinsik ini nyata semasa operasi append(). Tugasan seperti slice1 = append(slice1, 100) mencipta pengepala kepingan baharu yang mungkin atau mungkin tidak menghala ke tatasusunan asas yang sama seperti kepingan asal. Perkara ini penting untuk diingat semasa memanipulasi kepingan dalam kod Go.
Atas ialah kandungan terperinci Apakah Misteri Di Sebalik Gelagat Slice dalam Operasi append() dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!