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

Wie vermeide ich Out-of-Bounds-Fehler beim Slicing in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-03 03:57:14597Durchsuche

How to Avoid Out-of-Bounds Errors When Slicing in Go?

Slicing: Out of Bounds Error in Go

In Go ist Slicing ein leistungsstarker Vorgang, der es Ihnen ermöglicht, ein neues Slice aus einem zu erstellen bestehende. Es ist jedoch wichtig, die potenziellen Fallstricke zu verstehen, um Laufzeitfehler zu vermeiden.

Das Problem

Der folgende Code zeigt einen Fehler außerhalb der Grenzen beim Schneiden einer Null- Längenscheibe:

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)
}

Bei der Ausführung erzeugt dieser Code ein 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

Den Fehler verstehen

Um den Fehler zu verstehen, ist es wichtig, das Konzept des Slice-Slicing zu klären. In Go ist ein Slice ein Verweis auf einen zusammenhängenden Speicherbereich. Wenn Sie ein segmentiertes Slice erstellen, erstellen Sie einen neuen Verweis auf eine Teilmenge des ursprünglichen Slice.

Im Fall des obigen Codes hat das Slice b eine Länge von 0 und eine Kapazität von 5. Gemäß Gemäß der Go-Spezifikation „bezieht sich ein Slice-Index i auf das i-te Element des Slice in seinem aktuellen Zustand.“ Daher ist der Versuch, auf ein Element am Index 1 eines Slice mit einer Länge von 0 zuzugreifen, tabu.

Die Lösung

Um das Out-of- zu vermeiden Bei einem Grenzfehler stellen Sie sicher, dass die beim Slicing verwendeten Indizes innerhalb des gültigen Bereichs für das Original-Slice liegen. Bei Slices wird dieser Bereich durch die Länge und Kapazität des Slice bestimmt.

Zum Beispiel wären die folgenden Operationen gültig:

  • c := b[1:1]: Erstellt ein Slice der Länge 0 und der Kapazität 4.
  • c := b[1:2]: Erstellt ein Slice der Länge 1 und der Kapazität 4.
  • c := b[1:cap(b)]: Erstellt ein Segment der Länge 4 und der Kapazität 4.

Fazit

Slicing in Go ist ein grundlegender Vorgang zur Bearbeitung von Daten. Es ist jedoch wichtig, die Einschränkungen zu verstehen, um Laufzeitfehler zu vermeiden. Indem Sie sicherstellen, dass die beim Slicing verwendeten Indizes innerhalb des gültigen Bereichs liegen, können Sie Fehler außerhalb der Grenzen effektiv vermeiden und sicher mit Slices arbeiten.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Out-of-Bounds-Fehler beim Slicing in Go?. 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