Sobes.tech
Middle

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