При итерации по строке в Go с помощью цикла for range учитываются следующие нюансы:
for range итерирует по кодовым точкам Unicode (рунам), а не по байтам. Это означает, что каждый элемент итерации представляет собой одну руну (rune, псевдоним для int32), а не отдельный байт.for range возвращает два значения: смещение в байтах (int) и текущую руну (rune). Смещение указывает на начальный байт текущей руны в строке.for range корректно обрабатывает их, воспринимая каждый символ как одну руну, несмотря на то, что он занимает несколько байтов в underlying []byte представлении строки.for с индексом, обращаясь к строке как к массиву байтов: s[i]. В этом случае каждый элемент итерации будет иметь тип byte.for range может быть незначительно медленнее, чем итерация по байтам с помощью обычного for, особенно для строк, состоящих только из ASCII символов (где 1 руна = 1 байт). Однако для строк с многобайтными символами for range является более корректным и предпочтительным способом итерации.Пример:
go