So initialisieren Sie effizient ein Array oder schneiden aus einem unsicheren Array ab.Pointer in Go
In der Welt von Go können Sie auf Szenarien stoßen Hier müssen Sie mit Datenstrukturen arbeiten, die als unsicher.Pointer dargestellt werden. Beispielsweise könnten Sie einen Zeiger auf ein Array haben wie:
p := uintptr(unsafe.Pointer(&array)) size := 5
Ein direkter Zugriff auf ein Array ist jedoch nicht möglich, da der Zeiger lediglich eine Darstellung seiner Adresse ist. Dies stellt Sie vor die Herausforderung, ein Array oder Slice mit dem bekannten Zeiger, der bekannten Größe und dem bekannten Datentyp zu erstellen, ohne auf Speicherkopien zurückgreifen zu müssen.
Unsicherer Ansatz zur Array-/Slice-Erstellung
Zunächst können Sie den folgenden Ansatz in Betracht ziehen:
data := make([]byte, size) stepSize := unsafe.Sizeof(data[0]) for i := 0; i < size; i++ { data[i] = *(*byte)(unsafe.Pointer(p)) p += stepSize }
Diese Lösung kopiert Daten vom ursprünglichen Array in das neue Slice, was möglich ist ineffizient, insbesondere bei großen Datensätzen.
Effizienter Ansatz mit Reflect.SliceHeader
Eine effizientere Alternative besteht darin, die Leistung des Reflection-Pakets von Go und des Reflect.SliceHeader zu nutzen Typ. Durch direktes Bearbeiten der Felder von Reflect.SliceHeader können Sie ein Array oder Slice erstellen, das auf dieselben zugrunde liegenden Daten wie Ihr Zeiger verweist.
Schritt 1: Reflect.SliceHeader-Deskriptor abrufen
Deklarieren Sie eine Slice-Variable und wandeln Sie ihren []Byte-Typ mit unsicher in *reflect.SliceHeader um Konvertierungen:
var data []byte sh := (*reflect.SliceHeader)(unsafe.Pointer(&data))
Schritt 2: SliceHeader-Felder ändern
Weisen Sie den Zeiger, die Größe und optional die Kapazität den Feldern von Reflect.SliceHeader zu:
sh.Data = p sh.Len = size sh.Cap = size
Schritt 3: Zurück in die Originaldaten konvertieren Typ
Zuletzt wandeln Sie den geänderten „reflect.SliceHeader“ mit unsicheren Konvertierungen wieder in den gewünschten Datentyp um:
data = *(*[]byte)(unsafe.Pointer(sh))
Mit diesem effizienten Ansatz können Sie ein Array oder Slice erstellen, das gemeinsam genutzt werden kann die gleichen zugrunde liegenden Daten wie Ihr Zeiger, ohne dass die Kosten für unnötige Speicherkopien anfallen.
Das obige ist der detaillierte Inhalt vonWie erstelle ich effizient ein Go-Array oder -Slice aus einem unsicheren Zeiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!