Die Magie von Go: string → []byte — 3 Möglichkeiten, einen String in ein Byte-Array umzuwandeln

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum ist die Frage "How to assign string to bytes array" so beliebt?

\n\n

Wenn Sie jemals in Go (Golang) programmiert haben und vor der Notwendigkeit standen, einen gewöhnlichen String in ein Byte-Array ([]byte) umzuwandeln, sind Sie nicht allein. Die Frage "How to assign string to bytes array" auf Stack Overflow sammelt Zehntausende von Aufrufen. Es scheint einfach: Nehmen und zuweisen. Aber Go ist eine streng typisierte Sprache, und man kann einen String nicht einfach so einem Byte-Slice zuweisen. Man muss die richtigen Techniken kennen.

\n\n

In diesem Artikel werden wir die Umwandlung von string in bytes array in Go behandeln. Ich zeige Ihnen drei Hauptansätze: vom einfachsten bis zum superschnellen, aber gefährlichen. Sie erfahren, welche Methode Sie je nach Aufgabe wählen sollten, und werden nie wieder bei diesen Umwandlungen durcheinanderkommen.

\n\n

Los geht's!

\n\n

Ein wenig Theorie: Warum ist ein String kein Byte-Array?

\n\n

Bevor wir uns in den Code stürzen, lassen Sie uns verstehen, warum Go diese beiden Typen überhaupt unterscheidet. Dieses Wissen bewahrt Sie vor einem Dutzend Fehlern.

\n\n
    \n
  • string in Go ist eine unveränderliche (immutable) Sequenz von Bytes. Sie können ein Zeichen eines Strings nicht über einen Index ändern. Ein String wird immer als schreibgeschützter Speicherblock gespeichert.
  • \n
  • []byte ist ein veränderlicher (mutable) Byte-Slice. Sie können seinen Inhalt ändern, neue Elemente hinzufügen usw.
  • \n
\n\n

Aufgrund dieses Unterschieds in der "Unveränderlichkeit" verlangt Go eine explizite Umwandlung. Wenn der Compiler erlauben würde, einen String einfach einem Byte-Array zuzuweisen, könnten Sie versehentlich die "geschützten" Daten des Strings ändern. Daher erfordert das assign string to bytes array immer Ihre bewusste Handlung.

\n\n

Ansatz Nr. 1: Explizite Typumwandlung (Der Einfachste)

\n\n

Dies ist die erste Methode, die jedem Anfänger in den Sinn kommt. Und sie funktioniert!

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    myString := "Hallo, Go!"\n    myBytes := []byte(myString)\n\n    fmt.Println(myBytes) // [208 159 209 128 ...] — Bytes in UTF-8\n    fmt.Println(string(myBytes)) // Zurück: "Hallo, Go!"\n}\n
\n\n

Vorteile:

\n
    \n
  • Maximal einfach und lesbar.
  • \n
  • Standardmethode, die jeder Go-Entwickler versteht.
  • \n
\n\n

Nachteile:

\n
    \n
  • Erstellt eine neue Kopie der Daten im Speicher. Wenn der String sehr groß ist (z. B. 10 MB), kann dies speicher- und zeitintensiv sein.
  • \n
  • Nicht geeignet für High-Load-Systeme, bei denen jede Nanosekunde zählt.
  • \n
\n\n

Wann verwenden: In 90 % der Fälle. Für normale Anwendungen, Webdienste und Skripte ist dies mehr als ausreichend. Optimieren Sie nicht, wo es nicht nötig ist.

\n\n

Ansatz Nr. 2: Verwendung von copy() (Kontrolliert)

\n\n

Manchmal haben Sie bereits ein vorab zugewiesenes Byte-Array und möchten es mit Daten aus einem String füllen. Hier kommt die Funktion copy ins Spiel.

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    myString := "Go ist großartig"\n    \n    // Erstellen eines Byte-Slices mit der erforderlichen Länge\n    myBytes := make([]byte, len(myString))\n    \n    // Kopieren der Daten aus dem String in den Slice\n    n := copy(myBytes, myString)\n    \n    fmt.Printf("Kopierte Bytes: %d\\n", n) // 16\n    fmt.Println(string(myBytes)) // "Go ist großartig"\n}\n
\n\n

Beachten Sie: copy kopiert nur die Anzahl der Bytes, die in den Ziel-Slice passen. Wenn der Ziel-Slice kürzer als der String ist, wird nur seine Länge kopiert. Dies ist sicherer als die explizite Typumwandlung, wenn Sie sich über die Größe nicht sicher sind.

\n\n

Vorteile:

\n
    \n
  • Volle Kontrolle über den Kopiervorgang.
  • \n
  • Sicherheit: Sie überschreiten nicht die Array-Grenzen.
  • \n
  • Kann für teilweises Kopieren (Substring) verwendet werden.
  • \n
\n\n

Nachteile:

\n
    \n
  • Erfordert vorherige Speicherzuweisung (make).
  • \n
  • Es wird trotzdem eine Kopie der Daten erstellt.

Blogs

Buchempfehlungen