Sobes.tech
Middle

Milyen finomságok vannak egy string iterálásakor Go-ban?

sobes.tech MI

Válasz az MI-től

Amikor Go-ban egy sztringen iterálunk, fontos figyelembe venni, hogy a sztring egy bájtokból álló sorozat, nem Unicode karakterekből. A unicode/utf8 csomag funkciókat kínál több bájtos UTF-8 szekvenciák kezelésére.

Főbb pontok:

  • Iterálás bájtokon: A for i := 0; i < len(s); i++ ciklus egyes bájtokon iterál. Ha a sztring több bájtos karaktereket tartalmaz, egy karakter több bájtból állhat.

    // Példa bájtokon való iterálásra
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // bájtokat ír ki, nem karaktereket
    }
    
  • Iterálás runák (Unicode kódpontok) szerint: A helyes Unicode karakterekkel való munka érdekében a for index, ru := range s ciklust kell használni. Ez iterál a runákon (Unicode kódpontokon), kezelve a több bájtos UTF-8 szekvenciákat.

    // Példa runák szerint iterálásra
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // kiírja a runa kezdő indexét és magát a runát (int32-ként)
    }
    
  • A sztring hossza: A len(s) függvény a bájtok számát adja vissza, nem a runák számát. A runák számának lekéréséhez használja a utf8.RuneCountInString(s) függvényt.

    // Bájtok és runák számolása
    str := "Привет"
    println("Bájtok hossza:", len(str)) // a bájtok számát mutatja
    println("Runák száma:", utf8.RuneCountInString(str)) // a runák számát mutatja
    
  • Hozzáférés index szerint: A s[i] az i-edik bájtot adja vissza, nem a runát. A runákhoz közvetlen indexelés nem támogatott.

    // Bájt elérés példája
    str := "Привет"
    println(str[0]) // az első bájtot írja ki
    
  • Szeletelés sztringeknél: A sztring szeletek szintén bájt szinten működnek. s[i:j] egy új bájt szeletet hoz létre.

    // Sztring szeletelése bájtok szerint
    str := "Привет"
    println(str[0:2]) // hibás eredményt adhat, ha az első két bájt nem alkot teljes runát
    

A megbízható Unicode-kezeléshez Go-ban ajánlott a runák szerint történő iterálás (range) és a unicode/utf8 csomag függvényeinek használata.