Sobes.tech
Middle

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žijte utf8.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.