Строка (String) — базовый тип в языке Golang, представляющий собой простую последовательность байтов, но обладающий специальными методами для работы с ними.
При этом в Golang входит базовый пакет strings, который содержит основные (и достаточно простые) функций для работы со строковым типом данных. Эти функции похожи на типичные функции для работы со строками из других языков программирования, таких как C или C++.
Стоит также упомянуть базовый пакет fmt, используемый в примерах этой статьи для форматирования и вывода строк в консоль.
Как видно, помимо объявления строк Golang поддерживает обширный список возможностей для выполнения различных манипуляций над ними.
VDS и VPS
биллингом по всему миру: Россия, Азия и Европа.
Объявление строк
Прежде всего стоит сказать, что в Golang строки устроены несколько иначе, чем в Java, C++ или Python. По сути, это последовательность символов, каждый из которых имеет разный размер — то есть он может быть представлен одним или несколькими байтами в кодировке UTF-8.
Дело в том, что во времена изобретения языка C, символ в компьютере представлялся 7-битным кодом ASCII. Таким образом, строка представляла собой набор множества 7-битных символов ASCII.
Однако по мере роста использования компьютеров во всем мире 7-битной схемы ASCII стало недостаточно для поддержки символов других языков. Поэтому были предложены различные модели кодировки символов, такие как Unicode, UTF-8, UTF-16, UTF-32 и т. д.
Различные языки программирования имеют свою собственную схему кодировки символов. Например, Java изначально использует UTF-16. А вот Go, напротив, построен на кодировке UTF-8.
Именно благодаря ей строка Go может содержать универсальный текст, представляющий собой смесь любого существующего в мире языка — без какой-либо путаницы или любых других ограничений. При этом сами строки всегда статичны и имеют неизменный состав.
Через двойные кавычки
Существует несколько распространенных способов объявления (определения) строк в Go:
Строку можно также объявить без явного указания значения. В этом случае строковая переменная инициализируется нулевым значением — пустой строкой:
При использовании двойных кавычек при создании строковой переменной Go будет интерпретировать специальные (экранированные) символы, написанные через слэш. Например, такие как /n:
Через одинарные кавычки
Для того, чтобы компилятор Go игнорировал спецсимволы и при этом сохранял оригинальное форматирование строк, нужно использовать одинарные (обратные) кавычки.
Вот пример объявления Golang строки с явным указанием форматирования:
Обратите внимание, что для вывода строк в консоль используется пакет fmt.
А в этом примере Go полностью игнорирует экранированные символы:
Изменение строк
Смысл существования специального типа String в том, чтобы работать не с «сырой» последовательностью байтов, а со специальными методами, управляющими ей.
Однако, строго говоря, в Golang (в отличие от C и C++) строки изменять нельзя. Они статичны. Можно только получать доступ к конкретным символам по индексу:
Тем не менее, есть большое количество способов создания новых строк из уже существующих.
Важно знать, что некоторые функции для преобразования строк требуют включения специального пакета strings:
Конкатенация строк Golang
Самая базовая манипуляция — соединение (конкатенация) нескольких строк в одну целую. Выполняется с помощью оператора сложения:
Обратите внимание, что вы не можете складывать строки с другими типами. Например, с числовыми:
Чтобы пример выше работал, необходимо использовать функцию преобразования типов. В данном случае из int в string:
Обрезание строк
Можно обрезать начальные и конечные символы строки, указав их в отдельном аргументе:
Можно также разбить строку на подстроки, указав разделитель:
Склеивание строк
Можно склеить несколько строк, размещенных в массиве, в одну целую строку, явно указав разделитель:
Тем не менее, использование функции склеивания или оператора сложения для конкатенации строк — не самое лучшее решение. Такой род операций каждый раз создает новую строку, снижая производительность.
Поэтому в Golang есть специальный оптимизированный инструмент для сбора целых строк из составных частей с указанием неких правил — Builder:
Более подробно об этом типе можно узнать в официальной документации Go. Тем не менее, использование Builder довольно тривиально, т.к. он не содержит большого числа методов.
Разбиение строк
Разделить строку, указав отдельным аргументом разделитель, можно следующим образом:
Замена подстроки
Также есть несколько вариантов замены определенной подстроки на другую подстроку:
Изменение регистра
Go предоставляет возможность переключать регистр строк — увеличивать или уменьшать символы:
Создание строки из последовательности байтов
Вы также можете превратить последовательность явно указанных байтов в полноценную строку и работать уже с ней:
Сравнение строк
Поиск в строке подстроки
Один из вариантов — проверить наличие некоторой подстроки в строке:
Разумеется, классические операторы сравнения тоже приспособлены для поиска совпадений. Каждый из них посимвольно сравнивает строки в их лексическом порядке и с учетом длины:
Наличие префикса и суффикса
Помимо проверки на наличия подстроки, можно проверить вхождение в строку определенного префикса или суффикса:
Индекс вхождения подстроки
Можно получить индекс первого вхождения указанной подстроки:
Длина строки
Часто может потребоваться узнать длину строки с помощью специальной функции:
Так как Go использует кодировку UTF-8, длина строки соответствует количеству используемых байтов, а не число символов. Это связано с тем, что некоторые символы занимают 2 и более байта:
Например, вот так можно перебрать все байты на основе фактической (байтовой) длины строки:
Перебор строки
В некоторых практических случаях (в том числе и при определении схожести строк) может потребоваться последовательный ручной перебор всех символов строки. Сделать это можно с помощью цикла:
Вывод и форматирование строк
Форматирование с базовыми типами
Уже знакомый вам пакет fmt имеет специальные возможности для форматирования строк в момент их вывода в консоль. На самом деле его возможности не сильно отличаются от методов форматирования в других языках программирования — используются шаблоны (templates) и глаголы нотации (annotation verbs):
Обратите внимание, что для форматирования используется функция Sprintf, которая лишь возвращает строку, которая впоследствии выводится в консоль через Println.
Возможно использование и более сложных шаблонов форматирования с использованием нескольких переменных:
Вы можете также совместить несколько разных типов переменных в рамках одной функции форматирования:
Форматирование с бинарными данными
Можно также выполнять особый вывод с преобразованием чисел в бинарный форма «нулей и единиц»:
Подготовили для вас выгодные тарифы на облачные серверы
Заключение
Итак. Go предоставляет небольшой, но вполне достаточный инструментарий для манипулирования строками, покрывающий большую часть потребностей разработчика.
Одна из важных вещей, которую следует понимать при использовании строк Go, — то, что мы условно называем отдельными элементами строки (символами), на самом деле является последовательностью байтов UTF-8. Это значит, что при работе со строками мы манипулируем значениями байтов.
Поэтому попытка (которая запрещена в Go) изменения двухбайтового символа на однобайтовых приводила бы сбою.
- Каждый раз, когда мы изменяем строку, на самом деле мы ее пересоздаем заново, но с обновленными значениями.
- Каждый раз, когда мы запрашиваем длину строки, мы получаем не число символов, а фактическое количество используемых байтов.
Тем не менее, пакеты Go изобилуют функциями «манипулирования» строками. Однако в этой вводной статье были продемонстрированы базовые, но наиболее используемые способы взаимодействия со строками Go.
Помните, что в большинстве случаев продвинутое использование строк требует подключения специального пакета strings, а также задействования пакета fmt для форматирования строк при выводе в консоль.
Полную и подробную информацию о всех существующих методах этого пакета можно найти в официальной документации Go в соответствующем разделе «strings».
