Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: string iteration, Unicode, range, index, rune

Чем отличается итерация по строке через индекс от итерации через range применительно к многобайтовым символам Unicode?

Вопрос проверяет понимание разницы между доступом к строке по индексу и итерацией через range в контексте многобайтовых символов Unicode.

Короткий ответ

В Go строки — это последовательности байтов. Итерация по индексу возвращает отдельные байты, что может разбить многобайтовый символ Unicode. Итерация через range автоматически декодирует UTF-8 и возвращает руны (символы Unicode). Это важно для корректной обработки текста с не-ASCII символами, например, эмодзи или кириллицей.

Длинный ответ

Разница между итерацией по строке через индекс и через range

В Go строки хранятся как последовательности байтов в кодировке UTF-8. Это означает, что один символ Unicode (руна) может занимать от 1 до 4 байтов. При итерации по строке с помощью индекса вы получаете доступ к каждому байту по отдельности, что может привести к некорректной обработке многобайтовых символов. Например, символ 'Я' занимает 2 байта, и обращение по индексу вернет только первый байт, а не целый символ.

Итерация через range в Go специально спроектирована для работы с UTF-8. Она автоматически декодирует последовательность байтов в руны (тип rune, представляющий Unicode-символ). Это гарантирует, что вы получите каждый символ целиком, независимо от его длины в байтах.

Пример кода

package main

import "fmt"

func main() {
    s := "Привет, мир!"
    
    // Итерация по индексу (по байтам)
    fmt.Println("Итерация по индексу:")
    for i := 0; i < len(s); i++ {
        fmt.Printf("Байт %d: %x\n", i, s[i])
    }
    
    // Итерация через range (по рунам)
    fmt.Println("\nИтерация через range:")
    for i, r := range s {
        fmt.Printf("Позиция %d: руна %c (код %U)\n", i, r, r)
    }
}

В первом цикле выводятся отдельные байты, которые для многобайтовых символов будут разбиты на части. Во втором цикле каждая итерация возвращает полную руну, что позволяет корректно обрабатывать текст.

Вывод

Итерация через range предпочтительна для работы с текстом, содержащим Unicode-символы, так как она обеспечивает корректное декодирование и избегает ошибок, связанных с многобайтовыми последовательностями. Используйте итерацию по индексу только если вам нужен доступ к сырым байтам строки, например, для низкоуровневой обработки данных.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#string iteration

#Unicode

#range

#index

#rune

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.