Einleitung: Warum ist die Frage "How to assign string to bytes array" so beliebt?
\n\nWenn 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.
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\nLos geht's!
\n\nEin wenig Theorie: Warum ist ein String kein Byte-Array?
\n\nBevor 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
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\nAnsatz Nr. 1: Explizite Typumwandlung (Der Einfachste)
\n\nDies ist die erste Methode, die jedem Anfänger in den Sinn kommt. Und sie funktioniert!
\n\npackage 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\nVorteile:
\n- \n
- Maximal einfach und lesbar. \n
- Standardmethode, die jeder Go-Entwickler versteht. \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
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\nAnsatz Nr. 2: Verwendung von copy() (Kontrolliert)
\n\nManchmal 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.
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\nBeachten 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.
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
Nachteile:
\n- \n
- Erfordert vorherige Speicherzuweisung (
make). \n - Es wird trotzdem eine Kopie der Daten erstellt.