Строки в Go
В следующих главах ты узнаешь:
-
особенности внутренней структуры строковых типов;
-
какие преобразования связаны со строками;
как оптимизировать компилятор для преобразований между строками и байтовыми срезами; -
существуют ли иные методы конкатенации строк.
Как и во многих других языках программирования, строка также является одним из важных типов типов в Go. Далее мы рассмотрим важные факты о строках в Go.
Внутренняя структура строковых типов
Для стандартного компилятора Go внутренняя структура любого строкового типа объявляется следующим образом:
Из объявления мы знаем, что строка на самом деле является ссылкой на байты в памяти. Строки, инициализирующиеся в коде, являются immutable (не редактируемые). Строки динамически инициализирующиеся также нельзя изменить штатными средствами.
Обрати внимание, что в Go byte — это встроенный алиас типа uint8.
Подробнее о строках ты можешь узнать по ссылке.
Несколько простых фактов о строках
-
Строковые значения могут использоваться как константы наряду с логическими и всевозможными числовыми значениями.
-
Go поддерживает два стиля строковых литералов: стиль с двойными кавычками (или интерпретируемые литералы) и стиль с обратными кавычками (или необработанные строковые литералы).
Подробнее о стилях строковых литералов ты можешь узнать по ссылке.
-
Нулевые значения строковых типов — это пустые строки, которые могут быть представлены литералами "" или ``.
-
Строки могут быть объединены с операторами + и +=.
-
Все строковые типы сопоставимы (с помощью операторов \== и !\=). Как и целые числа и значения с плавающей запятой, два значения одного и того же строкового типа также можно сравнивать с помощью операторов > и <.
-
При сравнении двух строк их базовые байты будут сравниваться один за другим в цикле. Если одна строка является префиксом другой, а другая длиннее, то другая будет рассматриваться как более длинная.
Пример:
Самое время протестировать код!
Дополнительные факты о строковых типах и значениях в Go:
-
Как и в Java, содержимое (базовые байты) строковых значений неизменяемо. Длина строковых значений также не может быть изменена отдельно. Адресуемое строковое значение может быть полностью перезаписано только путем присвоения ему другого строкового значения.
-
У встроенного типа string нет методов, как и у большинства других встроенных типов в Go:
- Используй функции, предоставляемые в стандартном пакете strings, для выполнения всех видов манипуляций со строками.
-
Вызови встроенную функцию 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 каждое значение кодовой точки может храниться как один или несколько байтов (до четырех байтов). Например, каждая английская кодовая точка, которая соответствует одному английскому символу, хранится как один байт, а каждая китайская кодовая точка, соответствующая одному китайскому символу, хранится как три байта.