capypad
0 Tage Serie
go / beginner
Snippet

String-Indexierung und Slicing

Go-Strings sind Byte-Arrays, keine Rune-Arrays. `len(s)` gibt Byte-Anzahl zurück, was sich bei Unicode unterscheidet. Verwende `len([]rune(s))` für tatsächliche Zeichenanzahl. Slice Bytes direkt mit `s[:5]` aber verwende Runes für Zeichenoperationen.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
 
import (
"fmt"
"strings"
)
 
func main() {
s := "Hello, 世界"
fmt.Printf("Length in bytes: %d\n", len(s))
fmt.Printf("Length in runes: %d\n", len([]rune(s)))
fmt.Println("First 5 bytes:", s[:5])
fmt.Println("First rune:", string([]rune(s)[:1]))
fmt.Println("Contains 'World':", strings.Contains(s, "World"))
fmt.Println("Contains '世界':", strings.Contains(s, "世界"))
fmt.Println("HasPrefix 'Hello':", strings.HasPrefix(s, "Hello"))
fmt.Println("Join:", strings.Join([]string{"a","b"}, "-"))
}
Erklärung
1
len(s)
Gibt 13 Bytes zurück (H,e,l,l,o,',',space = 7 ASCII + 3 Bytes pro chinesisches Zeichen * 2)
2
len([]rune(s))
Gibt 8 Runes zurück (tatsächliche Zeichen)
3
s[:5]
Slice die ersten 5 Bytes, funktioniert für ASCII
4
strings.Contains(s, "世界")
Funktioniert korrekt mit Unicode-Strings