Wer weiß, warum der folgende Code ohne Panik läuft, greift er auf den Index eins über die Länge der Zeichenfolge.Slice Startposition größer als die Länge der Zeichenfolge
import (
"fmt"
)
func main() {
fmt.Println("hi"[2:])
}
Wer weiß, warum der folgende Code ohne Panik läuft, greift er auf den Index eins über die Länge der Zeichenfolge.Slice Startposition größer als die Länge der Zeichenfolge
import (
"fmt"
)
func main() {
fmt.Println("hi"[2:])
}
Es schneidet nicht "über" die Länge, 2 ist genau die Länge (ist gleich).
Für Arrays oder Strings, die Indizes in Bereich wenn
0 <= low <= high <= len(a)
, sonst sind sie außerhalb der Reichweite.
Da Sie ein string
schneiden, ist Indizes in Reichweite, wenn:
0 <= low <= high <= len(a)
Dieser Ausdruck:
"hi"[2:]
Da die oberen Schranke fehlt, wird standardmäßig Länge, das ist 2, so ist es äquivalent zu:
"hi"[2:2]
Dies ist in der Spezifikation absolut gültig und führt zu einer leeren string
. Wenn Sie es in "hi"[3:]
ändern, liegt es außerhalb des gültigen Bereichs und führt zu einem Fehler bei der Kompilierung (das Schneiden einer Konstanten string
kann zur Kompilierungszeit überprüft werden).
Begründung ist, dass die obere Grenze exklusiv ist, z. a[0:0]
ist gültig und wird 0-Länge, a[0:1]
hat eine Länge von 1, a[0:len(a)]
gültig und wird die gleiche Länge wie a
haben.
Bei Schichten kann die untere Grenze sogar größer sein als die Schichtlänge (darf aber die Schichtkapazität nicht überschreiten). Weitere Informationen finden Sie unter Slicing: Out of bounds error in Go.