Sobes.tech
Middle

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, koristi utf8.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.