Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Menggugurkan Elemen Pertama Slice dalam Go Mengubah Kapasitinya, Tetapi Menggugurkan Yang Terakhir Tidak?

Mengapa Menggugurkan Elemen Pertama Slice dalam Go Mengubah Kapasitinya, Tetapi Menggugurkan Yang Terakhir Tidak?

DDD
DDDasal
2024-11-04 02:30:01383semak imbas

Why Does Dropping the First Elements of a Slice in Go Change its Capacity, But Dropping the Last Doesn't?

Memahami Perubahan Kapasiti Slice: Menggugurkan Item Pertama vs. Last

Dalam Go, slice ialah struktur data yang menyediakan saiz dinamik yang boleh diubah pandangan tatasusunan asas. Apabila kapasiti hirisan berubah, ia mempengaruhi tatasusunan dan pengurusan memori yang mendasari.

Pertimbangkan kod Go berikut:

<code class="go">package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    // Drop its last two values
    s = s[:len(s)-2]
    printSlice(s)

    // Drop its first two values.
    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}</code>

Mengapa kapasiti hirisan berubah apabila dua item pertama digugurkan, tetapi bukan apabila dua item terakhir digugurkan?

Untuk menjawab soalan ini, kita mesti memahami cara hirisan Go dilaksanakan. Ia adalah struct dengan tiga medan:

  • tatasusunan: Penunjuk kepada tatasusunan asas
  • len: Bilangan elemen dalam kepingan
  • cap: Kapasiti daripada hirisan, atau bilangan maksimum elemen yang boleh disimpannya

Apabila dua item terakhir hirisan digugurkan (s = s[:len(s)-2]), medan len dikurangkan, tetapi penunjuk tatasusunan dan medan topi tetap sama. Ini kerana tatasusunan asas tidak diubah suai dan hirisan itu masih merujuk kepada tatasusunan yang sama.

Walau bagaimanapun, apabila dua item pertama hirisan digugurkan (s = s[2:]), yang baharu tatasusunan dicipta untuk memegang kepingan baharu. Medan len dikurangkan, penuding tatasusunan dikemas kini untuk menghala ke tatasusunan baharu dan medan topi juga dikurangkan untuk menggambarkan saiz tatasusunan baharu yang lebih kecil.

Kesimpulan

Kapasiti kepingan berubah apabila item pertama digugurkan kerana tatasusunan pendasar baharu mesti dibuat untuk menampung kepingan. Ini tidak perlu apabila item terakhir digugurkan kerana tatasusunan sedia ada masih boleh digunakan.

Atas ialah kandungan terperinci Mengapa Menggugurkan Elemen Pertama Slice dalam Go Mengubah Kapasitinya, Tetapi Menggugurkan Yang 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