Dalam bahagian "Slice the Slice" dalam Go Tour, satu transformasi yang kelihatan membingungkan berlaku. Selepas mengubah suai kepingan dengan menjatuhkan dua nilai pertamanya, kapasitinya berubah daripada 6 kepada 4. Tingkah laku ini bercanggah dengan andaian awal kami bahawa kapasiti harus kekal malar. Mari kita selidiki dengan lebih mendalam sebab di sebalik perubahan ini.
Memahami Kapasiti Slice
Slices in Go ialah struktur data yang menyediakan abstraksi ke atas tatasusunan. Mereka merujuk elemen daripada tatasusunan asas tetapi tidak memiliki storan sokongan. Kapasiti, sebaliknya, mewakili saiz tatasusunan asas yang boleh memuatkan elemen hirisan.
Punca Pengurangan Kapasiti
Menggugurkan elemen dari awal kepingan menggerakkan penuding data keratan ke kanan dalam tatasusunan asas. Akibatnya, jarak antara penuding data semasa hirisan dan penghujung tatasusunan berkurangan. Penurunan ini menunjukkan dirinya sebagai pengurangan dalam kapasiti.
Mengapa Hanya Pengubahsuaian Terakhir Mempengaruhi Kapasiti
Operasi lain, seperti menghiris untuk memberikan kepingan sifar panjang dan memanjangkan panjangnya, jangan ubah suai penunjuk data hirisan. Mereka hanya mengubah panjang kepingan, yang tidak menjejaskan jarak antara penuding data dan penghujung tatasusunan. Oleh itu, kapasiti kekal tidak berubah.
Butiran Slice Dalaman
Untuk mendapatkan pemahaman yang lebih mendalam, kita boleh mencetak pengepala kepingan menggunakan refleksi:
<code class="go">func printSlice(s []int) { sh := (*reflect.SliceHeader)(unsafe.Pointer(&s)) fmt.Printf("header=%+v len=%d cap=%d %v\n", sh, len(s), cap(s), s) }</code>
Output berikut menunjukkan perubahan dalam pengepala hirisan semasa pengubahsuaian dilakukan:
<code class="text">header=&{Data:272990208 Len:6 Cap:6} len=6 cap=6 [2 3 5 7 11 13] header=&{Data:272990208 Len:0 Cap:6} len=0 cap=6 [] header=&{Data:272990208 Len:4 Cap:6} len=4 cap=6 [2 3 5 7] header=&{Data:272990216 Len:2 Cap:4} len=2 cap=4 [5 7]</code>
Seperti yang dapat kita lihat, pengubahsuaian akhir mengalihkan penuding data, mengakibatkan kapasiti berkurangan.
Ringkasan
Kapasiti kepingan boleh berubah apabila elemen digugurkan dari permulaan kepingan. Ini kerana ia mengurangkan jarak antara penuding data hirisan dan penghujung tatasusunan asas. Operasi hirisan lain seperti menghiris kepada panjang sifar atau memanjangkan panjang tidak menjejaskan kapasiti. Memahami konsep ini adalah penting untuk bekerja dengan berkesan dengan kepingan Go.
Atas ialah kandungan terperinci Mengapa Menggugurkan Elemen pada Permulaan Slice Mengurangkan Kapasitinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!