Шаг 26.
Язык программирования Go.
Срезы строк

    На этом шаге рассмотрим получение срезов строк в Go.

    Язык Go поддерживает операцию получения срезов строк, используя синтаксис, напоминающий синтаксис языка Python. Этот синтаксис можно использовать для получения срезов значений любых типов.

    Поскольку строки в языке Go хранят текст в виде байтов в кодировке UTF-8, необходимо соблюдать меры предосторожности, чтобы при создании срезов не нарушить границ символов. В этом нет ничего сложного при работе с текстом, состоящим из 7-битных символов ASCII, поскольку каждый символ представлен единственным байтом, но в других случаях ситуация может оказаться намного более сложной, так как символы могут быть представлены одним и более байтами. Как правило, в обычной практике вообще не требуется извлекать срезы строк – достаточно иметь простую возможность итераций по символам в цикле for ...range, но иногда действительно бывает необходимо получить срез, чтобы извлечь подстроку. Один из способов, гарантирующих целостность границ символов при извлечении среза, заключается в использовании функций из пакета strings, таких как strings.Index() или strings.LastIndex().

    Задание 1. Имеется строка, из которой требуется извлечь первое и последнее слово. Слова разделены пробелами.

Раскрыть/скрыть решение и комментарии.

    Этот способ прекрасно подходит для случая с пробелами и другими 7-битными ASCII-символами, но он не пригоден для случаев, когда слова отделяются произвольными пробельными символами Юникода, такими как U+2028 (Line Separator – разделитель строк) или U+2029 (Paragraph Separator – разделитель абзацев).

    Задание 2. Имеется строка, из которой требуется извлечь первое и последнее слово. Слова могут разделяться произвольными пробельными символами.

Раскрыть/скрыть решение и комментарии.

    В случае с s := "clár", если записать инструкцию chars := []rune(s), будет создана переменная chars, хранящая срез значений типа rune (то есть int32) с четырьмя кодовыми пунктами, представляющими пять байт, как показано на рис. 1 шаг 25.

    Любое значение типа rune (кодовый пункт) легко можно преобразовать обратно в строку, содержащую единственный символ, с помощью выражения преобразования string(char).

    Для большей надежности извлечения срезов из произвольных строк, определения позиции символа, начиная с которого или заканчивая которым требуется получить срез, лучше использовать функции из пакета strings.

    Следующее равенство справедливо не только для срезов строк, но и для срезов любых других типов:

s == s[:i] + s[i:] // s – это строка; i – значение типа int; 0 ≤ i ≤ len(s)

    На следующем шаге рассмотрим фукнции пакета strings для работы со строками в Go.


Предыдущий шаг Содержание Следующий шаг