Sobes.tech
Middle

Welke nuances zijn er bij het itereren over een string in Go?

sobes.tech AI

Antwoord van AI

Bij iteratie over een string in Go is het belangrijk om te onthouden dat de string een reeks bytes voorstelt, niet Unicode-tekens. Het pakket unicode/utf8 biedt functies voor het werken met multibyte UTF-8-sequenties.

Belangrijke punten:

  • Iteratie over bytes: De lus for i := 0; i < len(s); i++ iterereert over individuele bytes. Als de string multibyte-tekens bevat, kan één teken door meerdere bytes worden weergegeven.

    // Voorbeeld van iteratie over bytes
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // geeft bytes weer, geen tekens
    }
    
  • Iteratie over runen (Unicode-codepunten): Voor correcte verwerking van Unicode-tekens, gebruik de lus for index, ru := range s. Deze iterereert over runen (Unicode-codepunten) en behandelt multibyte UTF-8-sequenties.

    // Voorbeeld van iteratie over runen
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // geeft de startindex van de rune en de rune zelf (als int32)
    }
    
  • Lengte van de string: De functie len(s) geeft het aantal bytes terug, niet het aantal runen. Gebruik utf8.RuneCountInString(s) om het aantal runen te krijgen.

    // Voorbeeld van het tellen van bytes en runen
    str := "Привет"
    println("Lengte in bytes:", len(str)) // toont het aantal bytes
    println("Lengte in runen:", utf8.RuneCountInString(str)) // toont het aantal runen
    
  • Toegang via index: Toegang s[i] geeft de i-de byte, niet de rune. Directe toegang tot runen via index wordt niet ondersteund.

    // Voorbeeld van toegang tot een byte
    str := "Привет"
    println(str[0]) // geeft de eerste byte van de string weer, niet de eerste rune
    
  • Slicing van strings: Slices van strings werken ook op byte-niveau. s[i:j] maakt een nieuwe byte-slice.

    // Voorbeeld van slicing van een string op bytes
    str := "Привет"
    println(str[0:2]) // kan een onjuiste sequentie tonen als de eerste twee bytes geen volledige rune vormen
    

Voor betrouwbare Unicode-verwerking in Go wordt aanbevolen om iteratie over runen (range) en functies uit het unicode/utf8-pakket te gebruiken.