Sobes.tech
Middle

Kokie yra niuansai dirbant su eilutės iteracija Go kalboje?

sobes.tech AI

Atsakymas iš AI

Eidami pereidami per stringą Go kalboje svarbu atkreipti dėmesį, kad eilutė yra baitų seka, o ne Unicode simboliai. unicode/utf8 paketas teikia funkcijas darbui su daugia baitėmis UTF-8 sekcijomis:

Pagrindiniai niuansai:

  • Eidami per baitus: for i := 0; i < len(s); i++ ciklas pereina per atskirus baitus. Jei eilutė turi daugia baitinius simbolius, vienas simbolis gali būti vaizduojamas keliais baitais:

    // Pavyzdys, kaip pereiti per baitus
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // išveda baitus, ne simbolius
    }
    
  • Eidami per raides (Unicode kodinius taškus): Norint teisingai dirbti su Unicode simboliais, naudokite ciklą for index, ru := range s. Jis pereina per raides (Unicode kodinius taškus), apdorodamas daugia baitines UTF-8 sekas:

    // Pavyzdys, kaip pereiti per raides
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // išveda raides pradžios indeksą ir pačią raidę (int32)
    }
    
  • Eilutės ilgis: len(s) grąžina baitų skaičių, o ne raides. Norėdami gauti raidių skaičių, naudokite utf8.RuneCountInString(s):

    // Baitų ir raidių skaičiavimas
    str := "Привет"
    println("Baitų ilgis:", len(str)) // baitų skaičius
    println("Raidių skaičius:", utf8.RuneCountInString(str)) // raidių skaičius
    
  • Prieiga per indeksą: s[i] grąžina i-tą baitą, ne i-tą raidę. Tiesioginė prieiga prie raidžių nenumatyta:

    // Prieigos prie baito pavyzdys
    str := "Привет"
    println(str[0]) // išveda pirmą baitą, ne pirmą raidę
    
  • Eilutės gabaliukai: Eilutės gabaliukai taip pat veikia baitų lygyje. s[i:j] sukuria naują baitų gabalą:

    // Eilutės gabaliukas pagal baitus
    str := "Привет"
    println(str[0:2]) // gali išvesti netinkamą seką, jei pirmi du baitai nesudaro pilnos raidės
    

Norint patikimai dirbti su Unicode, rekomenduojama naudoti iteraciją per raides (range) ir funkcijas iš unicode/utf8 paketo.