Mengapa Menggugurkan Elemen Slice Pertama Mengubah Kapasiti, Tetapi Menggugurkan Elemen Terakhir Tidak?

Susan Sarandon
Lepaskan: 2024-11-02 21:58:02
asal
974 orang telah melayarinya

Why Does Dropping First Slice Elements Change Capacity, But Dropping Last Elements Doesn't?

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
}
Salin selepas log masuk

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 = &amp;s[:cap(s)][0]
    }
    fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s)
}</code>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan