Heim > Backend-Entwicklung > Golang > Wie erstelle ich effizient ein Go-Array oder -Slice aus einem unsicheren Zeiger?

Wie erstelle ich effizient ein Go-Array oder -Slice aus einem unsicheren Zeiger?

Barbara Streisand
Freigeben: 2024-12-11 02:25:16
Original
628 Leute haben es durchsucht

How to Efficiently Create a Go Array or Slice from an unsafe.Pointer?

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
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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))
Nach dem Login kopieren

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
Nach dem Login kopieren

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))
Nach dem Login kopieren

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!

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