Назад к урокам

Строки и руны в Go

В этом уроке мы разберём, как Go работает со строками, рунами и UTF-8. Что такое rune, почему строки хранятся как байты, и как правильно итерировать символы. Разберём разницу между обычными строками, байтами и raw literals.

Начинающий10 min

🧵 Strings & Runes в Go

Работа с текстом в Go устроена иначе, чем во многих языках. В этом уроке мы разберём, как кодируются символы, что такое rune, почему строка - это байты, и как корректно обходить текст.


🔤 Текст и UTF-8

Go использует UTF-8 как базовую кодировку текста.

  • Кодировка - это способ представления символов в виде чисел.
  • Все символы мира (буквы, цифры, иероглифы, emoji) перечислены в таблицах - code pages.
  • Каждому символу соответствует code point (числовое значение).

🔡 Что такое rune?

Rune - это тип данных для представления одного символа (code point).

  • rune - псевдоним для int32
  • хранит числовое значение символа
  • создаётся через одинарные кавычки 'A', '😎'

Пример:

var r rune = 'A'
fmt.Println(r) // 65

Вывод символа:

fmt.Printf("%c
", r) // A

🧵 Что такое string?

В Go string - это набор байт, а не символов.

Строка содержит: - массив байт, - длину (в байтах), - и не имеет null-терминатора.

Пример:

s := "Привет"
fmt.Println(len(s)) // 12, не 6

🔁 Итерация по строкам

❌ По байтам:

s := "Привет"
for i := 0; i < len(s); i++ {
    fmt.Printf("%x ", s[i])
}

✔ По рунам:

for i, r := range "Привет" {
    fmt.Printf("%d: %c
", i, r)
}

🧱 Raw string literal

Строки в `, без экранирования:

text := `Hello,
World!
     no escaping`

📌 Итоги

Runes

  • rune = int32
  • представляют один символ
  • пишутся в ' '

Strings

  • хранят байты
  • UTF-8
  • символ ≠ байт
  • для символов использовать range

Raw Literal

  • через `
  • многострочные
  • без экранирования
Строки и руны в Go | WebSchool