Что такое `rune` в Go и в чем его отличие от `byte`?

Ответ

rune в Go — это псевдоним (алиас) для типа int32.

Он используется для представления Unicode Code Point (кодовой точки Юникода). В отличие от byte, который представляет один байт, rune может представлять любой символ, даже если для его кодирования в UTF-8 требуется несколько байт.

Ключевые отличия от byte:

  • Размер: byte (uint8) всегда 1 байт. rune (int32) — 4 байта.
  • Назначение: byte для работы с бинарными данными, rune — для работы с текстовыми символами.
  • Итерация по строке:
    • Стандартный for цикл по строке итерируется по байтам.
    • Цикл for ... range по строке итерируется по рунам (символам).

Пример, демонстрирующий разницу:

str := "Привет"

// 1. Итерация по байтам. Символы кириллицы в UTF-8 занимают 2 байта.
fmt.Printf("Длина в байтах: %dn", len(str)) // Вывод: Длина в байтах: 12

// 2. Итерация по рунам (символам).
runes := []rune(str)
fmt.Printf("Длина в рунах (символах): %dn", len(runes)) // Вывод: Длина в рунах (символах): 6

// Цикл for...range декодирует руны на лету
for i, r := range str {
    fmt.Printf("Индекс байта: %d, Символ: %cn", i, r)
}
// Вывод покажет, что индекс (i) скачет не на 1, а на 2 (размер символа в байтах)

Использование rune необходимо для корректной обработки многоязычного текста.