Direkt zum Hauptinhalt springen
eLearner.app
Modul 4 · Lektion 4 von 519/50 im Kurs~12 min
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

Go
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):

Go
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:

Go
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

Go
s := "ciao"
// s[0] = 'C'   // ERROR: cannot assign to s[0]

Zum Mutieren in []byte oder []rune konvertieren, operieren, zurückkonvertieren:

Go
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):

Go
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 zu Contains8).

Probieren Sie es aus

Übung#go.m4.l4.e1
Versuche: 0Wird geladen…

Iterieren Sie die Zeichenfolge s mit Bereich und geben Sie Index und Rune mit %d %c aus.

Editor wird geladen…
Hinweis anzeigen

Bereich über einen String gibt Byte-Offset + Rune zurück.

Lösung nach 3 Versuchen verfügbar

Übung#go.m4.l4.e2
Versuche: 0Wird geladen…

Wandeln Sie s in []rune um und geben Sie seine Länge in Zeichen aus.

Editor wird geladen…
Hinweis anzeigen

Explizite Konvertierung: `[]rune(s)`.

Lösung nach 3 Versuchen verfügbar

Quiz#go.m4.l4.e3
Bereit

Was ist len("ciaò")?

Go
s := "ciaò"
fmt.Println(len(s))
Antwortoptionen

Zusammenfassung

  • string = unveränderliche Bytefolge, UTF-8-kodiert.
  • len(s) = Bytes; s[i] = das i-te Byte (uint8).
  • for i, r := range s entschlüsselt Runen; i ist der Byte-Offset.
  • []rune(s) zum Indexieren nach Zeichen (kostspielig, reserviert).
  • Zum Mutieren: Gehen Sie über []byte oder []rune.
  • Zum Verketten in einer Schleife: strings.Builder.
  • Schlüsselpakete: strings, len(s)0, len(s)1, len(s)2.