Sobes.tech
Middle

Goда саптар боюнча иреттөөдө кандай нюанстар бар?

sobes.tech AI

AIден жооп

Go тилинде сапта жүрүп жатканда, сап UTF-8 байттардын тизмеси экенин эске алуу маанилүү, ал эми символдордун тизмеси эмес. unicode/utf8 пакети көп байттуу UTF-8 тизмектери менен иштөө үчүн функцияларды камсыз кылат:

Негизги нюанстар:

  • Байттар боюнча өтүү: for i := 0; i < len(s); i++ цикли жеке байттар боюнча өтөт. Эгер сапта көп байттуу символдор болсо, бир символ көп байттардан турушу мүмкүн:

    // Байттар боюнча өтүүнүн мисалы
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // байттарды чыгарат, символдорду эмес
    }
    
  • Рундар (Unicode кодтук такталары) боюнча өтүү: Unicode символдор менен туура иштөө үчүн for index, ru := range s циклін колдонуу керек. Ал көп байттуу UTF-8 тизмектери менен иштейт:

    // Рундар боюнча өтүүнүн мисалы
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // руна башталышынын индексин жана руна өзүн чыгарат (int32)
    }
    
  • Саптын узундугу: len(s) байттардын санын кайтарат, ал эми руна саны эмес. Рундардын санын алуу үчүн utf8.RuneCountInString(s) колдонулат:

    // Байттар жана руна санын эсептөө
    str := "Привет"
    println("Байттардын узундугу:", len(str)) // байттардын саны
    println("Рундар саны:", utf8.RuneCountInString(str)) // руна саны
    
  • Индекстер аркылуу жетүү: s[i] i-чи байтты кайтарат, ал эми i-чи руна эмес. Түз жетүү каралбайт:

    // Байтка жетүү мисалы
    str := "Привет"
    println(str[0]) // биринчи байтты чыгарат, биринчи руна эмес
    
  • Сап кесимдери: Сап кесимдери да байт деңгээлинде иштейт. s[i:j] жаңы байттар кесимин түзөт:

    // Байттар боюнча сап кесими
    str := "Привет"
    println(str[0:2]) // туура эмес тизмектин чыгышы мүмкүн, эгер ал биринчи эки байт бүт руна түзбөсө
    

Unicode менен ишенимдүү иштөө үчүн, range аркылуу өтүүнү жана unicode/utf8 пакети функцияларын колдонуу сунушталат.