go / intermediate
Snippet
Korrekte Verarbeitung von UTF-8-Text mit Runen
In Go sind Strings schreibgeschützte Byte-Slices. UTF-8-Zeichen wie Emojis oder Akzente belegen mehrere Bytes. Das Slicen oder Indizieren eines Strings greift direkt auf rohe Bytes zu, was Mehrbyte-Zeichen beschädigen kann. Go verwendet den Typ rune (ein Alias für int32), um einen Unicode-Codepunkt darzustellen. Eine range-Schleife über einen String decodiert UTF-8 automatisch in Runen, und das Konvertieren eines Strings in []rune ermöglicht den korrekten zeichenbasierten Direktzugriff sowie die Längenberechnung.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package mainimport "fmt"func main() {text := "Gopher 🚀"fmt.Println("Iterating by byte:")for i := 0; i < len(text); i++ {fmt.Printf("%x ", text[i])}fmt.Println()fmt.Println("Iterating by rune (range loop):")for index, runeVal := range text {fmt.Printf("%d:%q ", index, runeVal)}fmt.Println()runes := []rune(text)fmt.Printf("Sub-string length: %d, Char at index 7: %c\n", len(runes), runes[7])}
Erklärung
1
text := "Gopher 🚀"
Definiert einen String, der Standard-ASCII-Zeichen und ein Mehrbyte-Raketen-Emoji (das 4 Bytes benötigt) enthält.
2
len(text)
Gibt die Länge des Strings in Bytes (11 Bytes) zurück, nicht die Anzahl der Zeichen (8 Zeichen).
3
for index, runeVal := range text
Die range-Schleife decodiert UTF-8-Bytes automatisch in einzelne Runen und liefert deren Start-Byte-Indizes.
4
runes := []rune(text)
Konvertiert den String in ein Slice von Runen. Dies allokiert Speicher, ermöglicht aber einen zeichenbasierten O(1)-Direktzugriff wie runes[7].