Jaké jsou nuance při iteraci přes řetězec v Go?
sobes.tech AI
Odpověď od AI
Při iteraci přes řetězec v Go je důležité vzít v úvahu, že řetězec představuje posloupnost bajtů, nikoliv znaků Unicode. Balíček unicode/utf8 poskytuje funkce pro práci s vícibajtovými sekvencemi UTF-8.
Hlavní body:
-
Iterace přes bajty: Cyklus
for i := 0; i < len(s); i++iteruje přes jednotlivé bajty. Pokud řetězec obsahuje vícibajtové znaky, jeden znak může být reprezentován několika bajty.// Příklad iterace přes bajty str := "Привет" for i := 0; i < len(str); i++ { println(str[i]) // vypisuje bajty, nikoliv znaky } -
Iterace přes runy (body Unicode kódu): Pro správnou práci s Unicode znaky byste měli používat cyklus
for index, ru := range s. Tento iteruje přes runy (body Unicode kódu), zpracovávající vícibajtové sekvence UTF-8.// Příklad iterace přes runy str := "Привет" for index, ru := range str { println(index, ru) // vypisuje počáteční index runy a samotnou runu (jako int32) } -
Délka řetězce: Funkce
len(s)vrací počet bajtů, nikoliv počet run. Pro získání počtu run použijteutf8.RuneCountInString(s).// Příklad počítání bajtů a run str := "Привет" println("Délka v bajtech:", len(str)) // ukáže počet bajtů println("Délka v runách:", utf8.RuneCountInString(str)) // ukáže počet run -
Přístup podle indexu: Přístup
s[i]vrací i-tý bajt, nikoliv runu. Přímý přístup k runám podle indexu není podporován.// Příklad přístupu k bajtu str := "Привет" println(str[0]) // vypíše první bajt řetězce, nikoliv první runu -
Řezání řetězců: Řezání řetězců také pracuje na úrovni bajtů.
s[i:j]vytvoří nový řez bajtů.// Příklad řezu řetězce podle bajtů str := "Привет" println(str[0:2]) // může zobrazit nesprávnou sekvenci, pokud první dva bajty nevytvářejí úplnou runu
Pro spolehlivou práci s Unicode v Go se doporučuje používat iteraci přes runy (range) a funkce z balíčku unicode/utf8.