Koje su nijanse pri iteraciji kroz niz u Go?
sobes.tech АИ
Одговор од АИ
Prilikom iteracije kroz string u Go, važno je imati na umu da string predstavlja sekvencu bajtova, a ne Unicode karaktera. Paket unicode/utf8 pruža funkcije za rad sa višebajtovnim UTF-8 sekvencama.
Ključne tačke:
-
Iteracija kroz bajtove: Petlja
for i := 0; i < len(s); i++iterira kroz pojedinačne bajtove. Ako string sadrži višebajtne karaktere, jedan karakter može biti predstavljen višestrukim bajtovima.// Primer iteracije kroz bajtove str := "Привет" for i := 0; i < len(str); i++ { println(str[i]) // ispisuje bajtove, ne karaktere } -
Iteracija kroz rune (Unicode kodne tačke): Za ispravan rad sa Unicode karakterima, treba koristiti petlju
for index, ru := range s. Ona iterira kroz rune (Unicode kodne tačke), obrađujući višebajtne UTF-8 sekvence.// Primer iteracije kroz rune str := "Привет" for index, ru := range str { println(index, ru) // ispisuje početni indeks rune i samu runu (kao int32) } -
Dužina stringa: Funkcija
len(s)vraća broj bajtova, a ne broj rune. Za dobijanje broja rune, koristiutf8.RuneCountInString(s).// Primer brojanja bajtova i runa str := "Привет" println("Dužina u bajtovima:", len(str)) // prikazuje broj bajtova println("Dužina u runama:", utf8.RuneCountInString(str)) // prikazuje broj runa -
Pristup po indeksu: Pristup
s[i]vraća i-ći bajt, a ne runu. Direktni pristup runama po indeksu nije podržan.// Primer pristupa bajtu str := "Привет" println(str[0]) // ispisuje prvi bajt stringa, ne prvu runu -
Sečenje stringova: Sečenje stringova takođe radi na nivou bajtova.
s[i:j]kreira novi sečeni bajt.// Primer sečenja stringa po bajtovima str := "Привет" println(str[0:2]) // može prikazati netačnu sekvencu ako prvi dva bajta ne formiraju punu runu
Za pouzdano rad sa Unicode u Go, preporučuje se korišćenje iteracije po runama (range) i funkcija iz paketa unicode/utf8.