Rumah >pembangunan bahagian belakang >Golang >Mengapa `a[len(slice)]` Tidak Panik dalam Go Slices?
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:
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!