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
Lepaskan: 2024-12-12 16:40:10
asal
487 orang telah melayarinya

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

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!

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