Heim >Backend-Entwicklung >Golang >Warum erhalte ich beim Go Slicing die Fehlermeldung „Slice Bounds Out of Range'?

Warum erhalte ich beim Go Slicing die Fehlermeldung „Slice Bounds Out of Range'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-29 12:46:10147Durchsuche

Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

Slicing: Out-of-Bounds-Fehler in Go

In Go umfasst das Slicing das Extrahieren eines Teils eines vorhandenen Slice, um ein neues zu erstellen Scheibe. Wenn während des Slicings ein Fehler außerhalb der Grenzen auftritt, weist dies darauf hin, dass der angegebene Bereich die gültigen Indexgrenzen für das Quell-Slice überschreitet.

Beachten Sie den folgenden Codeausschnitt:

 Paket main</p>
<p>import "fmt"</p>
<p>func main() {</p>
<pre class="brush:php;toolbar:false">a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[1:]
printSlice("c", c)

}

func printSlice(s string, x []int) {

fmt.Printf("%s len=%d cap=%d %v\n",
    s, len(x), cap(x), x)

}

Das Ausführen dieses Codes führt zu einem Out-of-bounds Fehler:

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
panic: runtime error: slice bounds out of range

goroutine 1 [running]:
main.main()
   /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 +0x150

Um zu verstehen, warum dieser Fehler auftritt, müssen wir uns mit den Regeln für das Slicing in Go befassen.

Slicing-Regeln

Beim Slicing eines Slices oder Arrays können die angegebenen Indizes entweder explizit oder implizit sein. Wenn ein Index nicht explizit bereitgestellt wird, wird standardmäßig ein bestimmter Wert verwendet. Für Slices:

  • Eine fehlende Untergrenze ist standardmäßig 0.
  • Eine fehlende Obergrenze ist standardmäßig len(slice) (nicht cap(slice)).

Im angegebenen Code tritt der Fehler auf, weil der Slicing-Ausdruck zum Erstellen des C-Slice verwendet wird ist:

c := b[1:]

Dies bedeutet, dass die Untergrenze (1) explizit angegeben ist, die Obergrenze jedoch nicht. Daher wird standardmäßig len(b) verwendet, was 0 ist. Die angegebene Untergrenze (1) muss jedoch kleiner oder gleich der Obergrenze (0) sein. Diese Bedingung ist nicht erfüllt, was zu einem Fehler außerhalb der Grenzen führt.

Um diesen Fehler zu vermeiden, können Sie sowohl die Unter- als auch die Obergrenze explizit angeben. Um beispielsweise nur das zweite Element aus dem b-Slice zu extrahieren, würden Sie schreiben:

c := b[1:2] // c len=1 cap=4 [0]

Alternativ können Sie Folgendes verwenden, wenn Sie das gesamte b-Slice beginnend mit dem zweiten Element extrahieren möchten:

c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]

Das obige ist der detaillierte Inhalt vonWarum erhalte ich beim Go Slicing die Fehlermeldung „Slice Bounds Out of Range'?. 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