Slice-Operationen in Go: Die Grenzen für len(slice) verstehen
Warum erlaubt Go das Slicen von len(slice)? Diese Frage ergibt sich aus dem im folgenden Codeausschnitt beobachteten Verhalten:
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
Erklärung:
Die Go-Spezifikation für Slice-Ausdrücke besagt, dass Indizes im Bereich liegen, wenn 0 <= niedrig <= hoch <= len(a). Wichtig ist, dass für Arrays und Strings die obere Indexgrenze einschließlich len(a) ist. Für Slices ist die obere Indexgrenze cap(a), was in diesem Fall mit len(a) identisch ist.
Dies bedeutet, dass der Ausdruck a[3:] nicht in Panik gerät, da die obere Indexgrenze vorliegt darf bis einschließlich len(a) sein. Da jedoch auch die untere Indexgrenze bei 3 liegt, ist das resultierende Slice leer.
Ein Index größer als len(a) liegt außerhalb des Bereichs und verursacht eine Laufzeitpanik. Im Beispiel gerät a[4:] in Panik, weil es versucht, ein Slice mit einer oberen Indexgrenze größer als len(a) zu erstellen.
Daher erlaubt Go das Slicen von len(slice), da die Spezifikation dies ausdrücklich zulässt Indizes bis einschließlich len(a) für Arrays und Strings. Dies ermöglicht bequeme Slicing-Vorgänge, ohne dass explizite Prüfungen erforderlich sind, um sicherzustellen, dass die obere Indexgrenze innerhalb des angegebenen Bereichs liegt.
Das obige ist der detaillierte Inhalt vonWarum gerät man nicht in Panik, wenn man eine Scheibe bei „len(slice)' schneidet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!