Heim >Backend-Entwicklung >Golang >Warum erhalte ich beim Go Slicing die Fehlermeldung „Slice Bounds Out of Range'?
Slicing: Out-of-Bounds-Fehler in Go
In Go umfasst das Slicing das Extrahieren eines Teils eines vorhandenen Slice, um ein neues zu erstellen Scheibe. Wenn während des Slicings ein Fehler außerhalb der Grenzen auftritt, weist dies darauf hin, dass der angegebene Bereich die gültigen Indexgrenzen für das Quell-Slice überschreitet.
Beachten Sie den folgenden Codeausschnitt:
Paket main</p> <p>import "fmt"</p> <p>func main() {</p> <pre class="brush:php;toolbar:false">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)
}
Das Ausführen dieses Codes führt zu einem Out-of-bounds Fehler:
a len=5 cap=5 [0 0 0 0 0] b len=0 cap=5 [] panic: runtime error: slice bounds out of range goroutine 1 [running]: main.main() /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 +0x150
Um zu verstehen, warum dieser Fehler auftritt, müssen wir uns mit den Regeln für das Slicing in Go befassen.
Slicing-Regeln
Beim Slicing eines Slices oder Arrays können die angegebenen Indizes entweder explizit oder implizit sein. Wenn ein Index nicht explizit bereitgestellt wird, wird standardmäßig ein bestimmter Wert verwendet. Für Slices:
Im angegebenen Code tritt der Fehler auf, weil der Slicing-Ausdruck zum Erstellen des C-Slice verwendet wird ist:
c := b[1:]
Dies bedeutet, dass die Untergrenze (1) explizit angegeben ist, die Obergrenze jedoch nicht. Daher wird standardmäßig len(b) verwendet, was 0 ist. Die angegebene Untergrenze (1) muss jedoch kleiner oder gleich der Obergrenze (0) sein. Diese Bedingung ist nicht erfüllt, was zu einem Fehler außerhalb der Grenzen führt.
Um diesen Fehler zu vermeiden, können Sie sowohl die Unter- als auch die Obergrenze explizit angeben. Um beispielsweise nur das zweite Element aus dem b-Slice zu extrahieren, würden Sie schreiben:
c := b[1:2] // c len=1 cap=4 [0]
Alternativ können Sie Folgendes verwenden, wenn Sie das gesamte b-Slice beginnend mit dem zweiten Element extrahieren möchten:
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
Das obige ist der detaillierte Inhalt vonWarum erhalte ich beim Go Slicing die Fehlermeldung „Slice Bounds Out of Range'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!