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