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
Freigeben: 2024-11-29 12:46:10
Original
146 Leute haben es durchsucht

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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><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)
Nach dem Login kopieren

}

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

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

}

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
Nach dem Login kopieren

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:]
Nach dem Login kopieren

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]
Nach dem Login kopieren

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]
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage