Строки, руны и Unicode в Go
См. также: Типы данных и переменные · Справочник.
Модель строки
Тип string — неизменяемая последовательность байтов в кодировке UTF-8. Это не массив «символов»:
len(s)— число байт, не рун;- индекс
s[i]— один байт (byte, алиасuint8), не символ; - срез
s[0:2]может разрезать многобайтовый символ пополам и дать невалидный UTF-8.
Тип rune — алиас int32 для кодовой точки Unicode (U+XXXX). Литерал: 'Ж', '🙂'.
Итерация по символам
s := "café"
for i, r := range s {
fmt.Printf("байт %d: U+%04X %c\n", i, r, r)
}
range по строке декодирует UTF-8 и отдаёт (индекс байта начала руны, rune). Количество итераций — число рун, не len(s).
Подсчёт рун без аллокации:
n := utf8.RuneCountInString(s)
Пакет unicode/utf8: utf8.DecodeRuneInString, utf8.ValidString.
Сборка и изменение текста
Строки неизменяемы — конкатенация + в цикле создаёт много копий. Для накопления:
var b strings.Builder
b.Grow(estimatedSize) // опционально
b.WriteString("prefix")
b.WriteRune('—')
result := b.String()
strings.Builder не копирует буфер при каждом добавлении (в отличие от []byte + append без предварительного Grow в горячих циклах).
Преобразования:
| Нужно | Код |
|---|---|
string → []rune | []rune(s) — копия всех рун |
[]rune → string | string(runes) |
string → []byte | []byte(s) — копия байтов |
| Без копии байтов (осторожно) | unsafe или работа с []byte изначально |
Пакет strings
Часто используемые функции:
Contains,HasPrefix,HasSuffix,TrimSpace,TrimPrefixSplit,Join,Replace,ReplaceAllCompare— лексикографическое сравнение байтов (не локаль!)EqualFold— регистронезависимое сравнение для ASCII и простых случаев Unicode
Поиск подстроки: strings.Index, strings.Count. Для множественных разделителей — strings.FieldsFunc.
Сравнение и нормализация
Два визуально одинаковых текста могут состоять из разных последовательностей кодовых точек (например, буква «é» как один символ U+00E9 или как «e» + комбинирующий акут). Для надёжного сравнения имён, поиска, ключей:
import "golang.org/x/text/unicode/norm"
a := norm.NFC.String(inputA)
b := norm.NFC.String(inputB)
if a == b { /* ... */ }
Пакет golang.org/x/text — вне стандартной библиотеки, но де-факто стандарт для i18n. Для чистого ASCII достаточно == или EqualFold.
Типичные ошибки
- Срез по байтам —
s[:3]для обрезки «трёх символов» кириллицы. - Индексация в цикле
for i := 0; i < len(s); i++— обход байтов, не символов (допустимо для ASCII-протоколов). - Путать
lenи количество символов в UI и лимитах полей. - Регулярные выражения — в Go
regexpработает с индексами байт; для Unicode-символов иногда нужны классы\p{L}.
Практические сценарии
| Сценарий | Подход |
|---|---|
| Лог, протокол ASCII | []byte, len, индексы байт |
| Пользовательский ввод, UI | range, utf8, нормализация |
| JSON API | string как UTF-8; валидировать на границе |
| Хеш или HMAC | []byte исходного UTF-8, не «нормализованная» строка без правила |
Теги json:"name" и сериализация — в работе с БД и структурами и интерфейсах.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Основы языка Go - философия простоты, модель компиляции и идиоматичный подход к системной разработке. Go — это статически типизированный язык программирования общего назначения, разработанный компанией Google для создания эффективных, масштабируемых и надежных систем. Набор советов, правил, принципов и обычаев в разработке на этом языке. История Go - инженерные цели языка, философия простоты и эволюция инструментов экосистемы. Экосистема приложений на Go - встроенные инструменты, workflow разработки и практики сопровождения проектов. Кавычки, rune и string, точка, запятая, автоматическая вставка точки с запятой, скобки, подчёркивания и типичные ошибки новичков в Go. Предопределённые идентификаторы не являются ключевыми словами, но имеют специальное значение в языке. Их можно переопределить в локальной области видимости, но делать это не рекомендуется. Набор функций, которые включены в стандартную библиотеку языка. Особенности Go - интерфейсы, композиция, модель ошибок и практики написания поддерживаемого кода. Go вводит конкурентность через встроенные синтаксические конструкции и правила выполнения. Ниже рассматриваются основные направления практического применения Go, объяснённые через призму его технических характеристик и требований реальных инфраструктур. Типизация, набор правил определения типа данных значений языка.Основы языка Go
Что требуется знать перед началом изучения языка программирования Go
Рекомендации по разработке на Go
История языка Go
Экосистема приложений на Go
Синтаксис и пунктуация в Go
Ключевые слова языка Go
Встроенные функции и пакеты Go
Особенности языка Go
Синтаксические конструкции Go
Области применения Go
Типы данных и объявление переменных в Go