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.
Bedenken Sie den folgenden Codeausschnitt:
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 Fehler außerhalb der Grenzen:
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 befassen, die das Slicing in Go regeln.
Schneiden Regeln
Beim Slicing eines Slice 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 is:
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]
Wenn Sie alternativ das gesamte b-Slice beginnend mit dem zweiten Element extrahieren möchten, können Sie Folgendes verwenden:
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3