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)) }
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 }
Der folgende unsichere Vorgang zeigt, wie ein Slice-Zeiger in einen *reflect.SliceHeader konvertiert wird:
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
Sie können dann den Inhalt des Headers mit der Formatzeichenfolge %v:
fmt.Printf("%+v", sh)
The Go Playground erzeugt ausdrucken die folgende Ausgabe:
&{Data:1792106 Len:8 Cap:246}
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:
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!