Aké sú nuansy pri iterácii cez reťazec v Go?
sobes.tech AI
Odpoveď od AI
Pri iterácii cez reťazec v Go je dôležité mať na pamäti, že reťazec predstavuje sekvenciu bajtov, nie znakov Unicode. Balík unicode/utf8 poskytuje funkcie na prácu s viacbajtovými UTF-8 sekvenciami.
Hlavné body:
-
Iterácia cez bajty: Cyklus
for i := 0; i < len(s); i++iteruje cez jednotlivé bajty. Ak reťazec obsahuje viacbajtové znaky, jeden znak môže byť reprezentovaný viacerými bajtmi.// Príklad iterácie cez bajty str := "Привет" for i := 0; i < len(str); i++ { println(str[i]) // vypisuje bajty, nie znaky } -
Iterácia cez runy (body Unicode kódu): Pre správnu prácu s Unicode znakmi by ste mali používať cyklus
for index, ru := range s. Tento iteruje cez runy (body Unicode kódu), spracovávajúc viacbajtové UTF-8 sekvencie.// Príklad iterácie cez runy str := "Привет" for index, ru := range str { println(index, ru) // vypisuje počiatočný index runy a samotnú runu (ako int32) } -
Dĺžka reťazca: Funkcia
len(s)vracia počet bajtov, nie počet run. Pre získanie počtu run použiteutf8.RuneCountInString(s).// Príklad počítania bajtov a run str := "Привет" println("Dĺžka v bajtoch:", len(str)) // ukáže počet bajtov println("Dĺžka v runách:", utf8.RuneCountInString(str)) // ukáže počet run -
Prístup podľa indexu: Prístup
s[i]vracia i-ty bajt, nie runu. Priamy prístup k runám podľa indexu nie je podporovaný.// Príklad prístupu k bajtu str := "Привет" println(str[0]) // vypíše prvý bajt reťazca, nie prvú runu -
Rezy reťazcov: Rezy reťazcov tiež fungujú na úrovni bajtov.
s[i:j]vytvára nový rez bajtov.// Príklad rezu reťazca podľa bajtov str := "Привет" println(str[0:2]) // môže zobraziť nesprávnu sekvenciu, ak prvé dva bajty neobsahujú úplnú runu
Pre spoľahlivú prácu s Unicode v Go sa odporúča používať iteráciu cez runy (range) a funkcie z balíka unicode/utf8.