Slicing über die Länge hinaus in Go
Beim Slicing eines Slices in Go ist es möglich, einen Index über seine Länge hinaus anzugeben. Warum tritt dieses Verhalten auf und welche Auswirkungen hat es?
Gemäß der Go-Spezifikation gelten Array- und Slice-Indizes als im Bereich, wenn 0 ≤ niedrig ≤ hoch ≤ len(a). Somit sind die Indizes für Arrays oder Strings bis einschließlich len(a) gültig. Bei Slices wird die obere Indexgrenze jedoch durch ihre Kapazitätsgrenze (a) und nicht durch ihre Länge bestimmt.
Im gegebenen Beispiel
a := []int{1, 2, 3} fmt.Println(a[0:]) fmt.Println(a[1:]) fmt.Println(a[2:]) fmt.Println(a[3:]) // doesn't panic - why?? fmt.Println(a[4:]) // panics as expected
a[3:] ist dies nicht der Fall Panik, da es sich auf einen Teil des zugrunde liegenden Arrays bezieht, der über die aktuelle Länge des Slice hinausgeht, aber innerhalb seiner Kapazität bleibt. Dies führt zu einem leeren Slice. Allerdings löst ein[4:] eine Panik aus, da es die tatsächliche Länge des Arrays überschreitet.
Gemäß der Spezifikation führt der Zugriff auf Indizes außerhalb des angegebenen Bereichs zu einer Laufzeitpanik. Bei Slices kann die Kapazität jedoch als erweiterter Bereich für Slicing-Zwecke betrachtet werden, der Indizes bis zu len(a) zulässt.
Das obige ist der detaillierte Inhalt vonWarum ermöglichen Go-Slices die Indizierung über ihre Länge hinaus, ohne in Panik zu geraten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!