Care sunt nuanțele atunci când iterezi peste un șir în Go?
sobes.tech AI
Răspuns de la AI
Când iterezi peste un șir în Go, este important să ții cont că șirul reprezintă o secvență de octeți, nu de caractere Unicode. Pachetul unicode/utf8 oferă funcții pentru lucrul cu secvențe UTF-8 multibyte.
Puncte cheie:
-
Iterarea pe octeți: Bucla
for i := 0; i < len(s); i++iterează pe octeți individuali. Dacă șirul conține caractere multibyte, un caracter poate fi reprezentat de mai mulți octeți.// Exemplu de iterare pe octeți str := "Привет" for i := 0; i < len(str); i++ { println(str[i]) // afișează octeți, nu caractere } -
Iterarea pe rune (puncte de cod Unicode): Pentru a lucra corect cu caractere Unicode, trebuie să folosești bucla
for index, ru := range s. Aceasta iterează pe rune (puncte de cod Unicode), gestionând secvențe UTF-8 multibyte.// Exemplu de iterare pe rune str := "Привет" for index, ru := range str { println(index, ru) // afișează indexul de început al runei și chiar rune (ca int32) } -
Lungimea șirului: Funcția
len(s)returnează numărul de octeți, nu de rune. Pentru a obține numărul de rune, foloseșteutf8.RuneCountInString(s).// Exemplu de numărare a octeților și rune-urilor str := "Привет" println("Lungimea în octeți:", len(str)) // afișează numărul de octeți println("Lungimea în rune:", utf8.RuneCountInString(str)) // afișează numărul de rune -
Accesul pe bază de index: Accesul
s[i]returnează al i-lea octet, nu rune. Accesul direct la rune după index nu este suportat.// Exemplu de acces la un octet str := "Привет" println(str[0]) // afișează primul octet al șirului, nu prima rune -
Tăierea șirurilor: Tăieturile de șiruri funcționează și la nivel de octeți.
s[i:j]creează o nouă secvență de octeți.// Exemplu de tăiere a șirului pe octeți str := "Привет" println(str[0:2]) // poate afișa o secvență incorectă dacă primii doi octeți nu formează o rune completă
Pentru o lucrare fiabilă cu Unicode în Go, se recomandă utilizarea iterației pe rune (range) și funcțiile din pachetul unicode/utf8.