Heim >Backend-Entwicklung >Golang >Warum gerät „a[len(slice)]' in Go Slices nicht in Panik?

Warum gerät „a[len(slice)]' in Go Slices nicht in Panik?

Susan Sarandon
Susan SarandonOriginal
2024-12-12 16:40:10476Durchsuche

Why Doesn't `a[len(slice)]` Panic in Go Slices?

Go's Perplexing Slicing: Warum ein[len(slice)] nicht in Panik gerät

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:

  • Für Arrays und Strings, Indizes außerhalb des Bereichs werden als niedrig > definiert. len(a) oder high > len(a), wobei a das zugrunde liegende Array ist.
  • Für Slices werden Indizes außerhalb des Bereichs als hoch > definiert. cap(a), wobei cap(a) die Kapazität des Slice darstellt.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn