Sobes.tech
Middle

Welche Feinheiten gibt es bei der Iteration über eine Zeichenkette in Go?

sobes.tech KI

Antwort von AI

Beim Iterieren über eine Zeichenkette in Go ist es wichtig zu beachten, dass die Zeichenkette eine Sequenz von Bytes und keine Unicode-Zeichen darstellt. Das Paket unicode/utf8 bietet Funktionen zum Arbeiten mit mehrbyteigen UTF-8-Sequenzen.

Wichtige Punkte:

  • Iteration über Bytes: Die Schleife for i := 0; i < len(s); i++ iteriert über einzelne Bytes. Wenn die Zeichenkette mehrbyteige Zeichen enthält, kann ein Zeichen durch mehrere Bytes dargestellt werden.

    // Beispiel für die Iteration über Bytes
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // gibt Bytes aus, keine Zeichen
    }
    
  • Iteration über Runen (Unicode-Codepunkte): Für die korrekte Arbeit mit Unicode-Zeichen sollte die Schleife for index, ru := range s verwendet werden. Sie iteriert über Runen (Unicode-Codepunkte) und verarbeitet UTF-8-Multibyte-Sequenzen.

    // Beispiel für die Iteration über Runen
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // gibt den Startindex der Rune und die Rune selbst (als int32) aus
    }
    
  • Länge der Zeichenkette: Die Funktion len(s) gibt die Anzahl der Bytes zurück, nicht die Anzahl der Runen. Für die Anzahl der Runen verwenden Sie utf8.RuneCountInString(s).

    // Beispiel für die Zählung von Bytes und Runen
    str := "Привет"
    println("Länge in Bytes:", len(str)) // gibt die Byte-Anzahl aus
    println("Länge in Runen:", utf8.RuneCountInString(str)) // gibt die Anzahl der Runen aus
    
  • Zugriff nach Index: Der Zugriff s[i] gibt das i-te Byte zurück, nicht die Rune. Direkter Zugriff auf Runen nach Index ist nicht vorgesehen.

    // Beispiel für den Zugriff auf ein Byte
    str := "Привет"
    println(str[0]) // gibt das erste Byte der Zeichenkette aus, nicht die erste Rune
    
  • Slicing von Zeichenketten: Slices von Zeichenketten arbeiten ebenfalls auf Byte-Ebene. s[i:j] erstellt einen neuen Byte-Slice.

    // Beispiel für das Slicing einer Zeichenkette nach Bytes
    str := "Привет"
    println(str[0:2]) // kann eine inkorrekte Sequenz ausgeben, wenn die ersten beiden Bytes keine vollständige Rune bilden
    

Für eine zuverlässige Arbeit mit Unicode in Go wird empfohlen, die Iteration über Runen (range) und Funktionen aus dem Paket unicode/utf8 zu verwenden.