capypad
0 Tage Serie
go / beginner
Snippet

Strings, Runes und Bytes in Go verstehen

In Go ist ein String ein read-only Slice von Bytes. Jedes Zeichen in einem String kann 1 bis 4 Bytes belegen, abhängig vom Unicode-Codepunkt. Die eingebaute len()-Funktion gibt die Anzahl der Bytes zurück, nicht der Zeichen. Um die tatsächliche Zeichenanzahl zu erhalten, konvertiere zuerst zu []rune. Bei der Iteration mit range dekodiert Go immer ein Rune auf einmal, was es sicher für Multi-Byte-Zeichen macht.

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
23
24
25
package main
 
import (
"fmt"
"unicode"
)
 
func main() {
str := "Hello, 世界"
fmt.Printf("String: %s\n", str)
fmt.Printf("Length in bytes: %d\n", len(str))
fmt.Printf("Length in runes: %d\n", len([]rune(str)))
 
fmt.Println("\nIterating by byte:")
for i := 0; i < len(str); i++ {
fmt.Printf(" [%d] = 0x%X\n", i, str[i])
}
 
fmt.Println("\nIterating by rune:")
for i, r := range str {
fmt.Printf(" [%d] = '%c' (U+%04X)\n", i, r, r)
}
 
fmt.Printf("\nIs '世' a Chinese character? %v\n", unicode.Is(unicode.Han, '世'))
}
Erklärung
1
str := "Hello, 世界"
Erstellt einen String mit sowohl ASCII- als auch Multi-Byte-Unicode-Zeichen
2
len([]rune(str))
Konvertiert String zu Rune-Slice, um tatsächliche Zeichen statt Bytes zu zählen
3
for i, r := range str
Range dekodiert automatisch Runes und liefert sowohl Index als auch Unicode-Codepunkt
4
unicode.Is(unicode.Han, '世')
Nutzt das unicode-Paket, um zu prüfen, ob ein Rune zu einer Zeichenkategorie gehört