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. Gebruikutf8.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.