Rumah >pembangunan bahagian belakang >Golang >Mengapa `a[len(slice)]` Tidak Panik dalam Go Slices?

Mengapa `a[len(slice)]` Tidak Panik dalam Go Slices?

Susan Sarandon
Susan Sarandonasal
2024-12-12 16:40:10476semak imbas

Why Doesn't `a[len(slice)]` Panic in Go Slices?

Go's Perplexing Slicing: Mengapa a[len(slice)] Tidak Panik

Pengenalan

In Go, apabila menghiris tatasusunan atau hirisan, seseorang mungkin menjangkakan bahawa melebihi panjang tatasusunan atau kepingan asas akan mengakibatkan panik. Walau bagaimanapun, untuk hirisan, tingkah laku ini berbeza secara pelik.

Masalahnya

Pertimbangkan kod Go berikut:

a := []int{1, 2, 3}
fmt.Println(a[0:])
fmt.Println(a[1:])
fmt.Println(a[2:])
fmt.Println(a[3:]) // Surprisingly, doesn't panic
fmt.Println(a[4:]) // Panics as expected

membingungkan bahawa kepingan a [3:] tidak menimbulkan panik, walaupun nampaknya melebihi panjang tatasusunan.

Jawapannya

Tingkah laku ini ditentukan oleh spesifikasi bahasa Go:

  • Untuk tatasusunan dan rentetan, indeks luar julat ditakrifkan sebagai rendah > len(a) atau tinggi > len(a), dengan a ialah tatasusunan asas.
  • Untuk kepingan, indeks luar julat ditakrifkan sebagai tinggi > cap(a), dengan cap(a) mewakili kapasiti hirisan.

Dalam contoh kami, a ialah tatasusunan, dan panjangnya ialah 3. Walau bagaimanapun, penyambungan sehingga panjang tatasusunan, iaitu, a[3:], dianggap dalam julat yang sah kerana tatasusunan asas mempunyai panjang 3.

Seperti yang dijelaskan oleh spesifikasi, "Indeks atas terikat ialah cap kapasiti hirisan(a) dan bukannya panjang." Jadi, dalam kes ini, a[3:] mencipta kepingan kosong kerana tinggi - rendah = 3 - 3 = 0.

Perbezaan Utama

Adalah penting untuk ambil perhatian bahawa menggunakan indeks melebihi kapasiti kepingan (iaitu, a[4:] dalam contoh kami) kekal di luar julat dan akan mengakibatkan panik masa jalan. Spesifikasi secara eksplisit menyatakan ini: "Jika indeks berada di luar julat pada masa larian, panik masa larian berlaku."

Atas ialah kandungan terperinci Mengapa `a[len(slice)]` Tidak Panik dalam Go Slices?. 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