Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich in Go ein Byte-Slice aus einem String abrufen, ohne den Speicher zu kopieren?

Wie kann ich in Go ein Byte-Slice aus einem String abrufen, ohne den Speicher zu kopieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 10:59:02757Durchsuche

How Can I Retrieve a Byte Slice from a String in Go Without Memory Copying?

Abrufen eines Byte-Slices aus einem String ohne Speicherkopie mit Unsafe

Problem:

Sie müssen einen String konvertieren in ein Byte-Slice kopieren, ohne die Leistungseinbußen einer Speicherkopie in Kauf nehmen zu müssen, insbesondere bei der Verarbeitung großer Datenmengen.

Antwort:

Schritt 1: Verstehen Sie die Speicherkopie Problem

Strings in Go sind unveränderlich, was bedeutet, dass sie nicht an Ort und Stelle geändert werden können. Daher führt die Konvertierung einer Zeichenfolge in ein Byte-Slice mit der Syntax []byte(string) zu einer Speicherkopie.

Schritt 2: Unsicher verwenden

Um Speicher zu verhindern Beim Kopieren können unsichere Vorgänge eingesetzt werden. Die unsafe.String-Funktion kann verwendet werden, um einen Zeiger auf die zugrunde liegenden String-Daten abzurufen.

<code class="go">import "unsafe"

func unsafeGetBytes(s string) []byte {
    return (*[0x7fff0000]byte)(unsafe.Pointer(
        (*reflect.StringHeader)(unsafe.Pointer(&s)).Data),
    )[:len(s):len(s)]
}</code>

Erklärung:

  • Die unsafe.String-Funktion gibt a zurück Zeiger auf die Daten der Zeichenfolge.
  • Der Zeiger wird in ein großes Byte-Array umgewandelt ([0x7fff0000]Byte). Go ermöglicht unsicheres Casting in Arrays mit nicht spezifizierter Größe.
  • Das Array wird dann verwendet, um ein Byte-Slice mit der gleichen Länge wie die Zeichenfolge zu erstellen.

Zusätzliche Überlegungen:

  • Diese Methode sollte nur für interne Vorgänge verwendet werden, bei denen Unveränderlichkeit kein Problem darstellt.
  • Für allgemeine String-Verarbeitung, WriteString oder Schleifenoptimierungen (wie in der Problembeschreibung erwähnt) sind effizienter.
  • Das Komprimieren großer Datensätze mit gzip wird wahrscheinlich den Leistungsgewinn durch die Vermeidung von Speicherkopien zunichte machen.

Das obige ist der detaillierte Inhalt vonWie kann ich in Go ein Byte-Slice aus einem String abrufen, ohne den Speicher zu kopieren?. 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