Sobes.tech
Middle

Millised on nüansid, kui iteratsioon toimub stringi kaudu Go keeles?

sobes.tech AI

Vastus AI-lt

Go keeles stringi iteratsioonil on oluline arvestada, et string on baitide jada, mitte Unicode märkide jada. unicode/utf8 pakett pakub funktsioone UTF-8 mitme baitilise järjestuse töötlemiseks:

Peamised nüansid:

  • Iteratsioon baitide kaupa: for i := 0; i < len(s); i++ tsükkel läbib üksikud baitid. Kui string sisaldab mitme baitilisi märke, võib üks märk olla esindatud mitme baitiga:

    // Näide baitide kaupa iteratsioonist
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // väljastab baitid, mitte märke
    }
    
  • Iteratsioon märkide (Unicode koodipunktide) kaupa: Õige töötlemise jaoks Unicode märkidega kasutage for index, ru := range s. See läbib märke (Unicode koodipunktid), töötades UTF-8 mitme baitilise järjestusega:

    // Näide märkide iteratsioonist
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // väljastab märgi algusindeksi ja ise märgi (int32)
    }
    
  • Stringi pikkus: len(s) tagastab baitide arvu, mitte märkide arvu. Märkide arvu saamiseks kasutage utf8.RuneCountInString(s):

    // Baitide ja märkide arvu arvutamine
    str := "Привет"
    println("Baitide pikkus:", len(str)) // baitide arv
    println("Märkide arv:", utf8.RuneCountInString(str)) // märkide arv
    
  • Juurdepääs indeksiga: s[i] tagastab i-nda bait, mitte i-nda märgi. Otse märgi indeksiga juurdepääs ei ole ette nähtud:

    // Baiti juurde pääsemise näide
    str := "Привет"
    println(str[0]) // väljastab esimese baiti, mitte esimese märgi
    
  • Stringi viilud: Stringi viilud töötavad samuti baitide tasemel. s[i:j] loob uue baitide viilu:

    // Stringi viil baitide kaupa
    str := "Привет"
    println(str[0:2]) // võib väljastada ebatäpset järjestust, kui esimesed kaks baiti ei moodusta terviklikku märki
    

Usaldusväärseks töötlemiseks Unicode'iga soovitatakse kasutada märkide iteratsiooni (range) ja unicode/utf8 paketi funktsioone.