Heim > Backend-Entwicklung > Golang > Wie kann ich den Header eines Go-Slice sicher und unsicher überprüfen?

Wie kann ich den Header eines Go-Slice sicher und unsicher überprüfen?

Linda Hamilton
Freigeben: 2024-12-18 01:16:09
Original
437 Leute haben es durchsucht

How Can I Inspect the Header of a Go Slice Safely and Unsafely?

Inspizieren von Slice-Headern

In Go sind Slices Verweise auf zugrunde liegende Arrays und ihre Header speichern Informationen über die Länge und Kapazität des Slice sowie einen Zeiger darauf die zugrunde liegenden Daten. Während der Inhalt eines Slice geändert werden kann, bleibt sein Header normalerweise derselbe.

Bedenken Sie den folgenden Codeausschnitt:

var buffer [256] byte

func SubtractOneFromLength(slice []byte) []byte {
    slice = slice[0 : len(slice)-1]
    return slice
}

func main() {
    slice := buffer[10:20]
    fmt.Println("Before: len(slice) =", len(slice))
    newSlice := SubtractOneFromLength(slice)
    fmt.Println("After:  len(slice) =", len(slice))
    fmt.Println("After:  len(newSlice) =", len(newSlice))
    newSlice2 := SubtractOneFromLength(newSlice)
    fmt.Println("After:  len(newSlice2) =", len(newSlice2))
}
Nach dem Login kopieren

Wenn die Funktion SubtractOneFromLength aufgerufen wird, ändert sie das Slice, aber nicht der Slice-Header. Um den Slice-Header zu überprüfen, können Sie den Typ „reflect.SliceHeader“ verwenden.

type SliceHeader struct {
    Data uintptr
    Len  int
    Cap  int
}
Nach dem Login kopieren

Der folgende unsichere Vorgang zeigt, wie ein Slice-Zeiger in einen *reflect.SliceHeader konvertiert wird:

sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
Nach dem Login kopieren

Sie können dann den Inhalt des Headers mit der Formatzeichenfolge %v:

fmt.Printf("%+v", sh)
Nach dem Login kopieren

The Go Playground erzeugt ausdrucken die folgende Ausgabe:

&{Data:1792106 Len:8 Cap:246}
Nach dem Login kopieren

Diese Ausgabe liefert die Speicheradresse der zugrunde liegenden Daten (Data), die Länge des Slice (Len) und seine Kapazität (Cap).

Ohne unsicher:


Der Zugriff auf die Slice-Header-Informationen ohne unsicher ist auch möglich:

  • Verwenden &newSlice2[0] für Daten
  • len(newSlice2) für Len
  • cap(newSlice2) für Cap

Das obige ist der detaillierte Inhalt vonWie kann ich den Header eines Go-Slice sicher und unsicher überprüfen?. 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