Получить доступ

Как в Go устроены строки, байты и руны?

JuniorСрезы, мапы и строки
Ещё спрашивают так:
  • Почему len("привет") в Go равно 12?
  • Как перебрать символы строки в Go?
Коротко

Строка — неизменяемая последовательность байт, обычно в UTF-8. len возвращает число байт, а не символов: кириллица занимает 2 байта, поэтому len("привет") == 12. Руна (rune = int32) — код символа Unicode. for range по строке идёт по рунам, индекс s[i] — по байтам.

  • Число символов — utf8.RuneCountInString
  • []rune(s) — срез рун для работы с символами по индексу
  • Сборка строки в цикле — strings.Builder, конкатенация копирует

А ещё Преобразования string ↔ []byte копируют данные

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Устройство. Строка — пара {указатель, длина}, данные неизменяемы. Подстрока s[2:6] разделяет память с исходной.

Байты и руны. UTF-8 кодирует символы 1–4 байтами: латиница — 1 байт, кириллица — 2, эмодзи — 4. Поэтому индексация по байтам может попасть в середину символа.

Перебор:

  • for i := 0; i < len(s); i++ — байты;
  • for i, r := range s — руны, i — байтовое смещение начала руны;
  • []rune(s) — если нужен доступ по номеру символа.

Эффективная сборка: strings.Builder или bytes.Buffer; strings.Join для склейки среза.

Пакеты: strings (поиск, замена, разбиение), strconv (числа ↔ строки), unicode/utf8.

Пример

s := "привет"
fmt.Println(len(s))                        // 12
fmt.Println(utf8.RuneCountInString(s))     // 6
for i, r := range s {
    fmt.Println(i, string(r))              // 0 п, 2 р, 4 и ...
}
fmt.Println(s[0])                          // 208 — первый байт, не буква

Что хотят услышать

  • Строка как байты в UTF-8.
  • len в байтах, руны, range.
  • strings.Builder для сборки.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем