Lektionen des Moduls (4/5)
Strings, Bytes und Runen
In Go ist ein string eine unveränderliche Folge von Bytes. String-Literale
sind in UTF-8 kodiert. Ein rune ist ein Alias für int32 und
stellt einen einzelnen Unicode-Codepunkt dar.
Es ist wichtig, den Unterschied zwischen Bytes und Runen zu verstehen Vermeiden Sie Fehler, wenn eine Zeichenfolge Akzente, Emojis, Ideogramme oder ähnliches enthält Nicht-ASCII-Zeichen.
string = Bytes, keine Zeichen
s := "ciaò"
fmt.Println(len(s)) // 5 — not 4!
fmt.Println(s[0]) // 99 ('c' as a byte)
fmt.Println(s[3]) // 195 (first byte of 'ò' in UTF-8)len(s) gibt die Anzahl der Bytes zurück, nicht sichtbare Zeichen.
Die Indizierung von s[i] gibt das i-te Byte (uint8) zurück, nicht das Zeichen.
for range iteriert Runen
for i, r := range s dekodiert UTF-8 im laufenden Betrieb: i ist der Byte-Offset
Vom Anfang der Rune ist r die Rune (int32):
s := "ciaò"
for i, r := range s {
fmt.Printf("%d %c (U+%04X)\n", i, r, r)
}
// 0 c (U+0063)
// 1 i (U+0069)
// 2 a (U+0061)
// 3 ò (U+00F2) <- starts at byte 3, takes 2 bytes[]rune(s): Indizierung pro Zeichen
Explizite Konvertierung: Weist ein neues Runensegment zu. Teuer, aber manchmal notwendig:
runes := []rune("ciaò")
fmt.Println(len(runes)) // 4
fmt.Println(string(runes[3])) // òstring(runes) ist die umgekehrte Konvertierung: Nimmt einen []rune und produziert
eine UTF-8-Zeichenfolge.
Strings sind unveränderlich
s := "ciao"
// s[0] = 'C' // ERROR: cannot assign to s[0]Zum Mutieren in []byte oder []rune konvertieren, operieren, zurückkonvertieren:
b := []byte(s)
b[0] = 'C'
s = string(b) // "Ciao"Verkettung
Der +-Operator funktioniert, wird aber für viele Verkettungen in einer Schleife verwendet
strings.Builder (effizienter, vermeidet Zwischenzuweisungen):
var sb strings.Builder
for i := 0; i < 5; i++ {
sb.WriteString("ab")
}
fmt.Println(sb.String()) // "ababababab"Nützliche Pakete
strings:Contains,HasPrefix,Split,Join,ToUpper,Replace...strconv:Atoi,Itoa,Contains0,Contains1...Contains2:Contains3,Contains4,Contains5...Contains6:Contains7 (Alternative zuContains8).
Probieren Sie es aus
Iterieren Sie die Zeichenfolge s mit Bereich und geben Sie Index und Rune mit %d %c aus.
Hinweis anzeigen
Bereich über einen String gibt Byte-Offset + Rune zurück.
Lösung nach 3 Versuchen verfügbar
Wandeln Sie s in []rune um und geben Sie seine Länge in Zeichen aus.
Hinweis anzeigen
Explizite Konvertierung: `[]rune(s)`.
Lösung nach 3 Versuchen verfügbar
Was ist len("ciaò")?
s := "ciaò"
fmt.Println(len(s))Zusammenfassung
string= unveränderliche Bytefolge, UTF-8-kodiert.len(s)= Bytes;s[i]= das i-te Byte (uint8).for i, r := range sentschlüsselt Runen;iist der Byte-Offset.[]rune(s)zum Indexieren nach Zeichen (kostspielig, reserviert).- Zum Mutieren: Gehen Sie über
[]byteoder[]rune. - Zum Verketten in einer Schleife:
strings.Builder. - Schlüsselpakete:
strings,len(s)0,len(s)1,len(s)2.