Ответ
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
необходимо для корректной обработки многоязычного текста.