„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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“?

Veröffentlicht am 21.12.2024
Durchsuche:872

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.

Bedenken Sie den folgenden Codeausschnitt:

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 Fehler außerhalb der Grenzen:

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 befassen, die das Slicing in Go regeln.

Schneiden Regeln

Beim Slicing eines Slice 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 is:

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]

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

c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3