Rumah >pembangunan bahagian belakang >Golang >Mengapa Menggugurkan Elemen Slice Pertama Mengubah Kapasiti, Tetapi Menggugurkan Elemen Terakhir Tidak?

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

Susan Sarandon
Susan Sarandonasal
2024-11-02 21:58:021021semak imbas

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
}

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>

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!

Kenyataan:
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