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 пакети функцияларын колдонуу сунушталат.