Menukar Kapasiti Slice: Perbezaan Antara Menggugurkan Item Pertama dan Terakhir
Semasa meneroka fungsi slice Go, persoalan biasa timbul: mengapa sekeping kapasiti berkelakuan berbeza apabila menjatuhkan n item pertama berbanding n item terakhir?
Untuk menjawabnya, adalah penting untuk memahami bahawa kepingan Go berstruktur seperti berikut:
type slice struct { array unsafe.Pointer len int cap int }
Menggugurkan n Item Terakhir
Apabila mengalih keluar n item terakhir daripada hirisan (cth., s = s[:len(s)-2]), data hirisan masih disimpan dalam tatasusunan asas . Medan len dikemas kini untuk menggambarkan panjang baharu kepingan, manakala medan topi kekal tidak berubah. Ini mengekalkan peruntukan tatasusunan yang sama untuk hirisan.
Menggugurkan n Item Pertama
Walau bagaimanapun, apabila n item pertama digugurkan (mis., s = s[2: ]), data asas hirisan perlu dialihkan ke bahagian lain pada tatasusunan yang sama. Ini kerana lokasi memori asal untuk n elemen pertama tidak lagi sah. Hasilnya, kepingan baharu dibuat dengan penuding tatasusunan yang berbeza, melaraskan kedua-dua medan len dan cap.
Untuk menggambarkan perkara ini, mari kita tingkatkan fungsi printSlice untuk memaparkan penuding kepada tatasusunan asas:
<code class="go">func printSlice(s []int) { var ptr *int if cap(s) >= 1 { ptr = &s[:cap(s)][0] } fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s) }</code>
Menjalankan kod yang diubah suai ini menunjukkan cara operasi penghirisan mengubah penunjuk, panjang dan kapasiti, mengesahkan tingkah laku yang diterangkan di atas.
Atas ialah kandungan terperinci Mengapa Menggugurkan Elemen Slice Pertama Mengubah Kapasiti, Tetapi Menggugurkan Elemen Terakhir Tidak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!