Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengelakkan Ralat \'Slice Bounds Out of Range\' Apabila Menghiris dalam Go?
Apabila menghiris kepingan dalam Go, adalah penting untuk mematuhi had tertentu untuk mengelakkan ralat. Salah satu ralat tersebut ialah ralat "sempadan sempadan di luar julat". Ralat ini berlaku apabila ungkapan kepingan menghasilkan indeks yang berada di luar julat yang dibenarkan.
Dalam coretan kod yang disediakan:
package main import "fmt" func main() { a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[1:] printSlice("c", c) } func printSlice(s string, x []int) { fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x) }
Ralat berlaku apabila cuba mencipta kepingan c dengan ungkapan c := b[1:]. Ralat ini timbul bukan disebabkan oleh sempadan bawah (yang boleh sama dengan atau lebih besar daripada panjang), tetapi lebih kepada sempadan yang lebih tinggi.
Dalam Go, batas lalai lebih tinggi untuk menghiris ialah panjang operan yang dihiris . Walau bagaimanapun, dalam kes ini, operan yang dihiris b mempunyai panjang 0. Oleh itu, batas lalai lebih tinggi menjadi 0. Akibatnya, ungkapan c := b[1:] menghasilkan sempadan bawah 1 dan sempadan lebih tinggi 0 .
Ini melanggar peraturan penghirisan yang menyatakan bahawa untuk kepingan, indeks mesti memenuhi perkara berikut syarat:
0 <= low <= high <= cap(a)
Di mana:
Dalam kes ini, kerana 1 tidak kurang daripada atau sama dengan 0, ungkapan tersebut menghasilkan ralat di luar sempadan.
Untuk menyelesaikan isu ini, sempadan eksplisit mesti dinyatakan semasa menghiris. Contohnya:
c := b[1:1] // Slice from index 1 to 1 (empty slice) c := b[1:2] // Slice from index 1 to 2 (contains the element at index 1) c := b[1:cap(b)] // Slice from index 1 to the capacity of the operand (contains all elements)
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat \'Slice Bounds Out of Range\' Apabila Menghiris dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!