Какви са нюансите при итерация по низ в Go?
sobes.tech AI
Отговор от AI
При итерация по низ в Go е важно да се има предвид, че низът представлява последователност от байтове, а не от Unicode символи. Пакетът 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. Той итерира по руни (Unicode кодови точки), обработвайки много байтови 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-тия байт, а не руна. Пряк достъп до руни по индекс не е предвиден.// Пример за достъп до байт str := "Привет" println(str[0]) // ще изведе първия байт на низ, не първата руна -
Рязане на низове: Рязането на низове също работи на ниво байтове.
s[i:j]създава нов срез от байтове.// Пример за рязане на низ по байтове str := "Привет" println(str[0:2]) // може да изведе некоректна последователност, ако първите два байта не образуват пълна руна
За надеждна работа с Unicode в Go се препоръчва използването на итерация по руни (range) и функции от пакета unicode/utf8.