Einführung
In Go, Wenn man ein Array oder Slice aufteilt, könnte man davon ausgehen, dass eine Überschreitung der Länge des zugrunde liegenden Arrays oder Slice zu einer Panik führen würde. Bei Slices weicht dieses Verhalten jedoch seltsamerweise ab.
Das Problem
Bedenken Sie den folgenden Go-Code:
a := []int{1, 2, 3} fmt.Println(a[0:]) fmt.Println(a[1:]) fmt.Println(a[2:]) fmt.Println(a[3:]) // Surprisingly, doesn't panic fmt.Println(a[4:]) // Panics as expected
Verwirrend ist, dass das Slice a [3:] löst keine Panik aus, auch wenn es die Länge zu überschreiten scheint Array.
Die Antwort
Dieses Verhalten wird durch die Go-Sprachspezifikation vorgegeben:
In unserem Beispiel ist a ein Array und seine Länge beträgt 3. Wenn man jedoch bis zur Länge des Arrays spleißt, d. h. a[3:] wird als innerhalb des gültigen Bereichs betrachtet, da das zugrunde liegende Array eine Länge von 3 hat.
In der Spezifikation heißt es: „Die obere Indexgrenze ist die Slice-Kapazität.“ cap(a) statt der Länge.“ In diesem Fall erstellt a[3:] also ein leeres Slice, weil hoch – niedrig = 3 – 3 = 0.
Eine Schlüsselunterscheidung
Es ist wichtig Beachten Sie, dass die Verwendung eines Index, der über die Kapazität des Slice hinausgeht (d. h. a[4:] in unserem Beispiel), außerhalb des zulässigen Bereichs bleibt und zu einer Laufzeitpanik führt. In der Spezifikation heißt es ausdrücklich: „Wenn die Indizes zur Laufzeit außerhalb des Bereichs liegen, kommt es zur Laufzeitpanik.“
Das obige ist der detaillierte Inhalt vonWarum gerät „a[len(slice)]' in Go Slices nicht in Panik?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!