Руна (тип
rune) — это один символ Unicode. По сути это синоним типа int32: под капотом руна хранит числовой код символа (так называемый code point).Зачем это нужно: в Go строки хранятся в кодировке UTF-8, где один символ может занимать от 1 до 4 байт. Поэтому индексация строки по байтам (
s[i]) вернёт именно байт, а не символ — и для не-ASCII текста это будут «половинки» символа.Руны решают эту проблему: когда вы перебираете строку через
range или преобразуете её в []rune, Go корректно разбивает её на цельные символы, а не на байты.s := "Привет"
fmt.Println(len(s)) // 12 — байты
fmt.Println(len([]rune(s))) // 6 — символы
for i, r := range s {
fmt.Printf("%d: %c\n", i, r) // r имеет тип rune
}
🐸 Библиотека Go для собеса