rune и byte в чём разница?

Зачем придумали 2 отдельных типа данных и в чём их отличие и назначение?


Ответы (1 шт):

Автор решения: Pak Uula

rune - это 32-х битный тип, представляющий юникодные символы в кодировке UTF-32 aka UCS-4.

byte - это универсальный 8-битный тип.

rune используется для работы с не-ASCII символами в строках. Есть встроенное приведение []rune для типа string, которое парсит строку из UTF-8 (представление с переменной длиной байтов) в представление с фиксированной длиной байтов.

В случае не-ASCII строк разница между []byte(str) и []rune(str) разительна. Строка Привет, мир!:

Байты:  [208 159 209 128 208 184 208 178 208 181 209 130 44 32 208 188 208 184 209 128 33]
Руны:  [1055 1088 1080 1074 1077 1090 44 32 1084 1080 1088 33]

Приведение []rune(string) эквивалентно вот такой функции:

func ToRunes(bytes []byte) []rune {
    result := []rune{}
    for i := 0; i < len(bytes); {
        r, size := utf8.DecodeRune(bytes[i:])
        result = append(result, r)
        i += size
    }
    return result
}

Текст программы с преобразованием Привет, мир! в руны и обратно: https://go.dev/play/p/9CDY9Xm_NgV

→ Ссылка