Heim > Backend-Entwicklung > Golang > Wie vermeide ich „Slice Bounds Out of Range'-Fehler beim Slicing in Go?

Wie vermeide ich „Slice Bounds Out of Range'-Fehler beim Slicing in Go?

Linda Hamilton
Freigeben: 2024-12-04 00:21:09
Original
308 Leute haben es durchsucht

How to Avoid

Slicing in Go: Fehler außerhalb der Grenzen verstehen

Beim Slicing eines Slice in Go ist es wichtig, bestimmte Grenzen einzuhalten, um Fehler zu vermeiden. Ein solcher Fehler ist der Fehler „Slice-Grenzen außerhalb des Bereichs“. Dieser Fehler tritt auf, wenn der Slice-Ausdruck zu Indizes führt, die außerhalb des zulässigen Bereichs liegen.

Im bereitgestellten Codeausschnitt:

package main

import "fmt"

func main() {
    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)
}
Nach dem Login kopieren

Der Fehler tritt auf, wenn versucht wird, das C-Slice mit zu erstellen Ausdruck c := b[1:]. Dieser Fehler entsteht nicht durch die Untergrenze (die gleich oder größer als die Länge sein kann), sondern durch die Obergrenze.

In Go ist die standardmäßige Obergrenze für das Slicing die Länge des Slicing-Operanden . In diesem Fall hat der geschnittene Operand b jedoch eine Länge von 0. Daher wird die standardmäßige obere Grenze zu 0. Folglich führt der Ausdruck c := b[1:] zu einer unteren Grenze von 1 und einer oberen Grenze von 0 .

Dies verstößt gegen die Slicing-Regel, die besagt, dass die Indizes für Slices Folgendes erfüllen müssen Bedingung:

0 <= low <= high <= cap(a)
Nach dem Login kopieren

Wobei:

  • low ist die untere Grenze
  • high ist die obere Grenze
  • cap(a) ist die Kapazität des Sliced-Operanden

Da in diesem Fall 1 nicht kleiner oder gleich 0 ist, ist der Ausdruck führt zu einem Fehler außerhalb der Grenzen.

Um dieses Problem zu beheben, müssen beim Slicing explizite Grenzen angegeben werden. Zum Beispiel:

c := b[1:1]        // Slice from index 1 to 1 (empty slice)
c := b[1:2]        // Slice from index 1 to 2 (contains the element at index 1)
c := b[1:cap(b)]   // Slice from index 1 to the capacity of the operand (contains all elements)
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie vermeide ich „Slice Bounds Out of Range'-Fehler beim Slicing in Go?. 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 Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage