Что такое тип rune? Зачем их использовать?go-34

Что такое rune?

rune в Go — это псевдоним для int32, используемый для представления Unicode-символов (кодовых точек). Каждая rune соответствует одному символу Unicode, независимо от того, сколько байт этот символ занимает в UTF-8.

var r rune = 'A' // Это эквивалентно var r int32 = 65

Техническая реализация

  • Внутреннее представление: 32-битное целое число (int32)
  • Может представлять любой символ Unicode (до 1,114,112 возможных значений)
  • Литералы записываются в одинарных кавычках: 'ф', '🍎'

Зачем использовать rune?

1. Корректная обработка Unicode

s := "Привет, 世界!"
for _, r := range s { // r имеет тип rune
    fmt.Printf("%c ", r)
}
// Вывод: П р и в е т ,   世 界 !

2. Работа с многобайтовыми символами

emoji := '😊'
fmt.Println(emoji)        // Выведет: 128522
fmt.Printf("%c\n", emoji) // Выведет: 😊

3. Преобразование строк в руны и обратно

str := "日本語"
runes := []rune(str) // Преобразование строки в срез рун

Сравнение с byte

Характеристика rune (int32) byte (uint8)
Размер 4 байта 1 байт
Диапазон Любые символы Unicode Только ASCII (0-255)
Использование Unicode-текст Бинарные данные

Практические примеры

Подсчет символов

func CountChars(s string) int {
    return len([]rune(s))
}

fmt.Println(CountChars("Привет")) // 6, а не 12 как len(s)

Проверка на букву

func IsLetter(r rune) bool {
    return unicode.IsLetter(r)
}

fmt.Println(IsLetter('A'))  // true
fmt.Println(IsLetter('你')) // true (китайский иероглиф)

Особенности работы с рунами

  1. Итерация по строке:

    for i, r := range "日本語" {
        fmt.Printf("%d: %c\n", i, r)
    }
    
  2. Сравнение рун:

    if r1 == r2 {
        // сравнение кодовых точек
    }
    
  3. Конверсия типов:

    var r rune = '世'
    var i32 int32 = r // Безопасное преобразование
    

Резюмируем

  • rune — это int32, представляющий Unicode-символ
  • Основные применения:
    • Корректная обработка Unicode-строк
    • Работа с символами за пределами ASCII
    • Поддержка многобайтовых символов (например, эмодзи)
  • Преимущества перед byte:
    • Поддержка всех символов Unicode
    • Единообразное представление символов
    • Безопасная обработка UTF-8
  • Используйте rune для:
    • Подсчета символов в строке
    • Манипуляций с Unicode-текстом
    • Разбора сложных текстовых данных