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 kasutageutf8.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.