При итерации по строке в Go важно учитывать, что строка представляет собой последовательность байтов, а не символов Unicode. Пакет unicode/utf8 предоставляет функции для работы с многобайтовыми последовательностями UTF-8.
Основные нюансы:
Итерация по байтам: Цикл for i := 0; i < len(s); i++ итерирует по отдельным байтам. Если строка содержит многобайтовые символы, один символ может быть представлен несколькими байтами.
go
Итерация по рунам (Unicode-кодовым точкам): Для корректной работы с символами Unicode следует использовать цикл for index, ru := range s. Он итерирует по рунам (кодовым точкам Unicode), обрабатывая многобайтовые последовательности UTF-8.
go
Длина строки: Функция len(s) возвращает количество байтов, а не количество рун. Для получения количества рун используйте utf8.RuneCountInString(s).
go
Доступ по индексу: Доступ по индексу s[i] возвращает i-й байт, а не i-ю руну. Прямой доступ к рунам по индексу не предусмотрен.
go
Срезы строк: Срезы строк также работают на уровне байтов. s[i:j] создает новый срез байтов.
go
Для надежной работы с Unicode в Go рекомендуется использовать итерацию по рунам (range) и функции из пакета unicode/utf8.