Skip to content

Строки в Go

В следующих главах ты узнаешь:

  • особенности внутренней структуры строковых типов;

  • какие преобразования связаны со строками;
     как оптимизировать компилятор для преобразований между строками и байтовыми срезами;

  • существуют ли иные методы конкатенации строк.

Как и во многих других языках программирования, строка также является одним из важных типов типов в Go. Далее мы рассмотрим важные факты о строках в Go.

Внутренняя структура строковых типов

Для стандартного компилятора Go внутренняя структура любого строкового типа объявляется следующим образом:

Из объявления мы знаем, что строка на самом деле является ссылкой на байты в памяти. Строки, инициализирующиеся в коде, являются immutable (не редактируемые). Строки динамически инициализирующиеся также нельзя изменить штатными средствами.

Обрати внимание, что в Go byte — это встроенный алиас типа uint8.

Подробнее о строках ты можешь узнать по ссылке.

Несколько простых фактов о строках

  • Строковые значения могут использоваться как константы наряду с логическими и всевозможными числовыми значениями.

  • Go поддерживает два стиля строковых литералов: стиль с двойными кавычками (или интерпретируемые литералы) и стиль с обратными кавычками (или необработанные строковые литералы).

Подробнее о стилях строковых литералов ты можешь узнать по ссылке.

  • Нулевые значения строковых типов — это пустые строки, которые могут быть представлены литералами "" или ``.

  • Строки могут быть объединены с операторами + и +=.

  • Все строковые типы сопоставимы (с помощью операторов \== и !\=). Как и целые числа и значения с плавающей запятой, два значения одного и того же строкового типа также можно сравнивать с помощью операторов > и <. 

  • При сравнении двух строк их базовые байты будут сравниваться один за другим в цикле. Если одна строка является префиксом другой, а другая длиннее, то другая будет рассматриваться как более длинная.

Пример:

Самое время протестировать код!

Дополнительные факты о строковых типах и значениях в Go:

  • Как и в Java, содержимое (базовые байты) строковых значений неизменяемо. Длина строковых значений также не может быть изменена отдельно. Адресуемое строковое значение может быть полностью перезаписано только путем присвоения ему другого строкового значения.

  • У встроенного типа string нет методов, как и у большинства других встроенных типов в Go:

  • Вызови встроенную функцию len, чтобы получить длину строки (количество байтов, хранящихся в строке).

  • Используй синтаксис доступа к элементам aString[i], представленный в доступе к элементам контейнера, чтобы получить значение byte по индексу, хранящееся в aString. Выражение aString[i] не адресуется. То есть значение aString[i] не может быть изменено.

  • Используй синтаксис subslice aString[start:end], чтобы получить подстроку aString. Здесь start и end — оба индекса байтов, хранящихся в aString.

  • Для стандартного компилятора Go целевая строковая переменная и исходное строковое значение в присваивании строки будут совместно использовать одну и ту же базовую последовательность байтов в памяти. Результат выражения подстроки aString[start:end] также использует ту же базовую последовательность байтов, что и базовая строка aString в памяти.

Пример:

Самое время протестировать код!

Обрати внимание: если все индексы aString и в выражениях aString[i] и aString[start:end] являются константами, то константные индексы вне допустимого диапазона вызовут сбой компиляции. И обратите внимание, что результаты оценки таких выражений всегда непостоянны  (это может измениться или не измениться с более поздней версии Go ). Например, следующая программа напечатает 4 0.

Самое время протестировать код!

Кодировка строк и Unicode code points

Стандарт Unicode определяет уникальное значение для каждого символа во всех видах человеческих языков. Но основной единицей в Юникоде является не символ, а кодовая точка. Для большинства кодовых точек каждая из них соответствует символу, но для некоторых символов каждая из них состоит из нескольких кодовых точек (code points).

Кодовые точки представлены в виде значений рун в Go. В Go rune это встроенный псевдоним типа int32.

В приложениях существует несколько методов кодирования для представления кодовых точек, таких как кодировка UTF-8 и кодировка UTF-16. Сейчас наиболее популярным методом кодирования является кодировка UTF-8. В Go все строковые константы отображаются в кодировке UTF-8. Во время компиляции недопустимые строковые константы в кодировке UTF-8 приведут к сбою компиляции. Однако во время выполнения среда выполнения Go не может предотвратить недопустимое кодирование некоторых строк в UTF-8.

Для кодировки UTF-8 каждое значение кодовой точки может храниться как один или несколько байтов (до четырех байтов). Например, каждая английская кодовая точка, которая соответствует одному английскому символу, хранится как один байт, а каждая китайская кодовая точка, соответствующая одному китайскому символу, хранится как три байта.